




На самом деле, где он создается, решение о реализации принимает автор компилятора. Скорее всего, строковые литералы будут храниться в сегментах памяти, доступных только для чтения, поскольку они никогда не меняются.
В старые времена компиляторов у вас были статические данные, такие как эти литералы, и глобальные, но изменяемые данные. Они хранились в сегменте ТЕКСТ (код) и сегменте ДАННЫЕ (инициализированные данные).
Даже когда у вас есть такой код, как 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().
@Destructor, я предполагаю, что это был комментарий к ответу Джеймса Хопкина. Это ответ, который утверждает, что «строковые литералы действительны в течение всей продолжительности программы, даже во время уничтожения статических объектов». Ни мой ответ, ни ответ «Раскрутка» (другой, на который вы поставили этот комментарий) не утверждают этого, но, по крайней мере, вы окружили Джеймса :-)
Да, строковые литералы действительны на протяжении всей программы, даже при уничтожении статических объектов.
2.13.4 / 1 в Стандарте говорит
An ordinary string literal has type "array of n const char" and static storage duration.
Стандарт говорит о «статической продолжительности хранения» в 3.7.1 / 1:
The storage for these objects shall last for the duration of the program.
Ну да. Они вроде как должны быть; информация, составляющая последовательность символов в каждой строке, должна где-то находиться. Если бы они были выделены динамически, а затем инициализированы, где бы располагалась информация, используемая для инициализации? Таким образом, более эффективно просто сделать строки статическими, чтобы они всегда были доступны и действительны после завершения загрузки программы.
Строковые литералы хранятся в сегментах памяти, доступных только для чтения.
Вероятно, но не обязательно. Соответствующая реализация мог хранит строковые литералы в памяти для чтения-записи. Любая программа, которая может определить разницу, в любом случае имеет неопределенное поведение. Конечно, их хранение в постоянной памяти - хорошая идея (если базовая система поддерживает это).
Сегмент BSS всегда содержал только обнуленные, но непостоянные данные; данные, инициализированные ненулевыми значениями, находились в сегменте DATA.