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?
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ą.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.
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.
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
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