Строковый литерал в C++ создан в статическом ЗУ?

Это, вероятно, очевидно, но предоставленные запросы будут отображать все файлы, но, возможно, вам не интересно знать, что ваши файлы конфигурации или проекта наиболее обновляются. Простой grep будет изолировать ваши файлы кода, например:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
42
задан Carl Seleborg 8 December 2008 в 20:07
поделиться

4 ответа

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

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

, Даже когда у Вас есть код как char *x = "hello";, эти hello, сама строка хранится в постоянной памяти, в то время как переменная x находится на стеке (или в другом месте в writeable памяти, если это - глобальное). 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 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

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

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

42
ответ дан paxdiablo 4 August 2019 в 19:37
поделиться

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

2.13.4/1 в Стандарте говорит

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

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

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

44
ответ дан James Hopkin 4 August 2019 в 19:37
поделиться

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

3
ответ дан unwind 4 August 2019 в 19:37
поделиться

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

-1
ответ дан Samiksha 4 August 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: