Czy ciąg znaków w c++ jest tworzony w pamięci statycznej?

Czy ciąg znaków w c++ jest tworzony w pamięci statycznej i niszczony tylko po zakończeniu programu?

Author: Carl Seleborg, 2008-12-08

4 answers

Gdzie jest tworzony jest decyzja implementacji przez kompilatora, naprawdę. Najprawdopodobniej literały ciągów będą przechowywane w segmentach pamięci tylko do odczytu, ponieważ nigdy się nie zmieniają.

W dawnych czasach kompilatora, miałeś dane statyczne, takie jak te literały, i globalne, ale zmienne dane. Były one przechowywane w segmencie tekstowym (kodowym) i danych (dane inicjalizowane).

Nawet jeśli masz kod podobny do char *x = "hello";, sam łańcuch hello jest przechowywany w pamięci tylko do odczytu, podczas gdy zmienna x znajduje się na stosie (lub gdzie indziej w pamięci do zapisu, jeśli jest globalna). x po prostu zostaje ustawiony na adres hello string. Pozwala to na wszelkiego rodzaju trudne rzeczy, takie jak składanie łańcuchów, tak że" invalid option "(0x1000) i" valid option " (0x1002) mogą używać tego samego bloku pamięci w następujący sposób:

+-> plus:0   1   2   3   4   5   6   7   8   9   A   B   C   D   E
|      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
0x1000 | i | n | v | a | l | i | d |   | o | p | t | i | o | n | \0 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

Pamiętaj, że nie mam na myśli pamięci tylko do odczytu w sensie ROM, tylko pamięć, która jest przeznaczona do przechowywania niezmiennych rzeczy (które mogą być oznaczone naprawdę tylko do odczytu przez OS).

Nie są też niszczone, dopóki nie wyjdą.
 38
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 11:45:42

Tak, literały ciągów są ważne przez cały czas trwania programu, nawet podczas niszczenia obiektów statycznych.

2.13.4 / 1 w standardzie pisze

Zwykły ciąg znaków ma typ "array of N const char" i statyczny czas przechowywania.

Standard mówi o "statycznym czasie przechowywania" w 3.7.1/1:

Przechowywanie tych obiektów powinno trwać przez czas trwania programu.

 42
Author: James Hopkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 09:57:08

No cóż ... Tak. Tak jakby muszą być; informacja, która składa się na sekwencję znaków w każdym łańcuchu musi gdzieś być. Jeśli mają być przydzielane dynamicznie, a następnie inicjalizowane, gdzie znajdują się informacje użyte do inicjalizacji? W ten sposób bardziej wydajne jest po prostu uczynić ciągi statyczne, tak że są one zawsze dostępne i ważne po zakończeniu ładowania programu.

 3
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 09:51:58

Literały łańcuchów są przechowywane w tylko do odczytu segmentach pamięci

 -1
Author: Samiksha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-08 09:59:06