Создается ли строковый литерал в С ++ в статической памяти?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
46
0
17 176
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

В старые времена компиляторов у вас были статические данные, такие как эти литералы, и глобальные, но изменяемые данные. Они хранились в сегменте ТЕКСТ (код) и сегменте ДАННЫЕ (инициализированные данные).

Даже когда у вас есть такой код, как 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().

Сегмент BSS всегда содержал только обнуленные, но непостоянные данные; данные, инициализированные ненулевыми значениями, находились в сегменте DATA.

Jonathan Leffler 05.08.2011 02:21

@Destructor, я предполагаю, что это был комментарий к ответу Джеймса Хопкина. Это ответ, который утверждает, что «строковые литералы действительны в течение всей продолжительности программы, даже во время уничтожения статических объектов». Ни мой ответ, ни ответ «Раскрутка» (другой, на который вы поставили этот комментарий) не утверждают этого, но, по крайней мере, вы окружили Джеймса :-)

paxdiablo 21.02.2017 15:52

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

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.

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

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

Вероятно, но не обязательно. Соответствующая реализация мог хранит строковые литералы в памяти для чтения-записи. Любая программа, которая может определить разницу, в любом случае имеет неопределенное поведение. Конечно, их хранение в постоянной памяти - хорошая идея (если базовая система поддерживает это).

Keith Thompson 15.09.2011 08:42

Другие вопросы по теме