Это зависит от вашей системы и от того, как вы используете переменную. Для static
переменных:
Случай 1: Вы никогда не используете переменную, и компилятор молча отбрасывает ее. Это не может произойти с extern
переменными.
Случай 2: Вы используете переменную, но никогда не берете ее адрес. Компилятор преобразует использование переменной в непосредственные операнды, как если бы это было #define
или enum
. Компилятор все еще может преобразовывать extern
статический в непосредственные операнды, но он все равно должен найти адрес для него.
Случай 3: Если вы используете переменную и берете ее адрес, компилятор вынужден найти место для помещения ее в объектный код, точно так же, как если бы это было extern
.
Что касается «данных» в сравнении с «программной» памятью, то это очень специфично для используемой вами системы. В моей системе Linux x64 / ELF она, вероятно, будет помещена в раздел .rodata
, который находится в том же сегменте, что и код (.text
), но отличается от сегмента данных для чтения и записи (.bss
, .data
). Похоже, моя система не создает отдельный сегмент для неисполняемых данных только для чтения.
Приложение: Обратите внимание, что поведение в C ++ отличается. В C ++ переменная const
по умолчанию имеет внутреннюю связь, поэтому static const
является избыточной и extern const
необходима для получения константы с внешней связью.