Как упомянуто в C ++ Complete Reference, постоянные данные хранятся в ПЗУ. Но локальные переменные хранятся внутри стека, который находится в оперативной памяти. Итак, если мы объявим локальные постоянные данные, где они хранятся? RAM или ROM?
Единственно верный ответ:это зависит».
C ++ — это один уровень абстракции над аппаратным обеспечением, который производит код, который может быть «состоялся«каким-то другим программным обеспечением, таким как операционная система.
То, как оно использует аппаратное обеспечение, зависит от того, что это за аппаратное обеспечение и как оно работает, и как оно управляется, и как разработчик компилятора намеревался использовать все эти возможности.
Разница между константой и переменными заключается в том, что переменные предназначены (разработчиком языка) для изменения и сохраняют свое значение, в то время как константы предназначены для того, чтобы никогда не изменяться.
Единственное, что C ++ говорит о константе, это то, что попытка изменить их приводит к «неопределенному поведению»: «разработчик языка ничего не говорит о том, что может (или не может) случиться».
Разработчик компилятора делает все возможное, совместимо с платформой, на которой он работает. Некоторые константы хранятся в реальном ПЗУ (например, в микроконтроллерах), некоторые в ОЗУ с «отказом в доступе на запись» (так что при попытке их изменить генерируется аппаратная ловушка: что происходит, зависит от ОС: обычно ловушка переведено в исключение ОС, которое может поддерживаться или не поддерживаться языком) некоторые просто в ОЗУ, где не существует такого «средства», другие даже внутри самой инструкции машинного кода.
В любом случае, если вы сами не программируете аппаратное обеспечение, вам не следует обращать на это внимание.
И сказать, что «константа может идти в ПЗУ» может быть правдой (если платформа позволяет это), но «константа хранится в ПЗУ» — это просто ложь.
Термин «ПЗУ» обычно зарезервирован для аппаратного обеспечения, которое физически неспособно к записи. Константы по-прежнему помещаются в физически «оперативную память» (в противном случае, как ваша программа может даже загружаться?)
Технически, в спецификации мало защиты от записи … это просто неопределенное поведение если ты так сделаешь.
Что касается того, где хранится материал, то есть некоторые типичные практики на современных архитектурах. Но компилятор может свободно принимать собственные решения. Посмотрите это, например:
Локальные постоянные данные хранятся в стеке во время выполнения. Статические локальные и глобальные данные обычно хранятся в сегменте только для чтения во время компиляции. Однако компилятор может выполнять некоторые оптимизации и хранить даже локальные константы в сегменте только для чтения.