Подтвердить что ты не робот

Является ли компилятор C обязательным всегда перезагружать значение const из памяти?

У меня есть переменная const в моей встроенной программе C. Он был определен и инициализирован с помощью 0 в программном коде. Он помещается в специальную область ПЗУ через компоновщик script. Можно изменить содержимое специальной области с помощью специальной процедуры программирования, но она не может быть изменена во время выполнения основной программы.

Вопрос заключается в том, нужно ли объявлять константу как volatile. Если он не помечен как volatile, то компилятор разрешил заменить все ссылки на него с помощью 0? Или он обязан загружать его хотя бы один раз во время выполнения программы?

4b9b3361

Ответ 1

Похоже, ваша переменная действительно является константой (т.е. не изменяется во время выполнения программы) со значением, неизвестным компилятору. Если это так, вы можете объявить его следующим образом:

extern const int variable;

(т.е. без volatile и без инициализатора) и пусть компоновщик script или другие инструменты настроят правильное значение.

Затем компилятору будет разрешено загрузить его и, возможно, оставить его в регистре навсегда, но не заменить его на 0 или любое другое значение во время компиляции.

Ответ 2

Если помечено как volatile, компилятор обязан загружать его из памяти каждый раз, когда ему это нужно.

Если он не помечен как volatile, компилятор может загрузить его один раз из памяти, сохранить его в регистре и использовать этот регистр, а не загружать его снова.

Не оптимизирующий компилятор может это сделать, но он также может тупо загружать его каждый раз. (Поскольку перегрузка на самом деле сама по себе оптимизация.)

Оптимизация компиляторов может заметить const и решить, что он может быть скомпилирован с его реальным, буквальным значением; до точки, где исходная константа вообще не отображается в разделе .data вашей программы. (Или, может быть, он делает, но он никогда не получает "читать".)

Поскольку вы изменяете значение в компоновщике script, компилятор не может "знать" значение, полученное после компиляции. В этом случае используйте volatile: единственный способ сообщить компилятору не доверять тому, что значение известно при компиляции.