Строковый литерал в c ++ создан в статической памяти? - PullRequest
40 голосов
/ 08 декабря 2008

Строковый литерал в c ++ создается в статической памяти и уничтожается только при выходе из программы?

Ответы [ 4 ]

44 голосов
/ 08 декабря 2008

Да, строковые литералы действительны в течение всей продолжительности программы, даже при уничтожении статических объектов.

2.13.4 / 1 в стандарте гласит

Обычный строковый литерал имеет тип "массив из n const char" и статическую длительность хранения.

Стандарт говорит о «статической продолжительности хранения» в 3.7.1 / 1:

Хранение этих объектов должно продолжаться в течение всей программы.

39 голосов
/ 08 декабря 2008

То, где он создан, на самом деле является решением реализации автора компилятора. Скорее всего, строковые литералы будут храниться в сегментах памяти только для чтения, поскольку они никогда не меняются.

В старые времена компилятора у вас были статические данные, подобные этим литералам, и глобальные, но изменяемые данные. Они были сохранены в сегменте TEXT (код) и сегменте DATA (инициализированные данные).

Даже если у вас есть код, подобный char *x = "hello";, сама строка hello сохраняется в постоянной памяти, а переменная x находится в стеке (или в другом месте в доступной для записи памяти, если она глобальная). x просто получает адрес строки hello. Это допускает все виды хитрых вещей, таких как сворачивание строк, так что «недопустимая опция» (0x1000) и «допустимая опция» (0x1002) могут использовать один и тот же блок памяти следующим образом:

+-> 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 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

Имейте в виду, я не имею в виду память только для чтения в терминах ПЗУ, а просто память, предназначенную для хранения неизменяемого содержимого (которое ОС может пометить как действительно доступное только для чтения).

Они также никогда не уничтожаются, пока main() не выйдет.

3 голосов
/ 08 декабря 2008

Ну ... Да. Они вроде должны быть; информация, которая составляет последовательность символов в каждой строке, должна быть где-то. Если бы они распределялись динамически, а затем инициализировались, где находилась бы информация, используемая для инициализации? Таким образом, эффективнее просто сделать строки статичными, чтобы они всегда были доступны и действовали после завершения загрузки программы.

0 голосов
/ 08 декабря 2008

Строковые литералы хранятся в сегментах памяти, доступных только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...