Const против статического Const - PullRequest
42 голосов
/ 17 июня 2011

Как компилятор (например, GCC) выделяет переменные const и static const, например, где она будет находиться? В памяти данных или памяти программ?

Ответы [ 2 ]

39 голосов
/ 17 июня 2011

Это зависит от вашей системы и от того, как вы используете переменную. Для static переменных:

Случай 1: Вы никогда не используете переменную, и компилятор молча отбрасывает ее. Это не может произойти с extern переменными.

Случай 2: Вы используете переменную, но никогда не берете ее адрес. Компилятор преобразует использование переменной в непосредственные операнды, как если бы это было #define или enum. Компилятор все еще может преобразовывать extern статический в непосредственные операнды, но он все равно должен найти адрес для него.

Случай 3: Если вы используете переменную и берете ее адрес, компилятор вынужден найти место для помещения ее в объектный код, точно так же, как если бы это было extern.

Что касается «данных» в сравнении с «программной» памятью, то это очень специфично для используемой вами системы. В моей системе Linux x64 / ELF она, вероятно, будет помещена в раздел .rodata, который находится в том же сегменте, что и код (.text), но отличается от сегмента данных для чтения и записи (.bss, .data). Похоже, моя система не создает отдельный сегмент для неисполняемых данных только для чтения.

Приложение: Обратите внимание, что поведение в C ++ отличается. В C ++ переменная const по умолчанию имеет внутреннюю связь, поэтому static const является избыточной и extern const необходима для получения константы с внешней связью.

5 голосов
/ 17 июня 2011

Дитрих уже хорошо объяснил случай static переменных.

Для локальных переменных у реализации компилятора есть несколько вариантов того, где разместить квалифицированную переменную const, для которой берется адрес.Он может быть или не быть размещен в стеке или в статической памяти.Это особенно верно для const квалифицированных составных литералов.Адреса двух таких литералов, которые локально объявлены в разных областях, могут быть объединены в один, и их адреса могут сравниваться одинаково.

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