2017-01-12 7 views
-1

Добрый день,C++ глобальные константы в ОЗУ не ПЗУ

Я заметил, что, когда у меня есть следующий код:

int foo(const int arg){ 
    return arg*10; 
} 

const int MY_VAR = foo(10); 

main(){ 

    while(true){ 

    } 
} 

Тогда my_var помещается в секции RW данных (RAM). Честно говоря, я ожидал ошибку компилятора. Я использую версию GNU ARM 6.2 2016q4.

Если я создаю MY_VAR constexpr, тогда я получаю ошибку компилятора. Если я создам foo constexpr, то, как и ожидалось, MY_VAR помещается в .text-раздел (т. Е. В ПЗУ).

Поскольку переменные constexpr не могут использоваться как extern, мне придется использовать константные переменные для действительно глобальных констант.

Какие способы, которыми я могу автоматически (например, предупреждение или ошибка компилятора) обнаружить, что константа не назначена ПЗУ?

Я хочу использовать возможность инициализации некоторых глобальных констант с функциями. Хотя я бы хотел поймать случаи, когда функция не constexpr автоматически.

+1

константа 'MY_VAR' является глобальной. он выделен в ОЗУ – Raindrop7

+0

Кстати, вы попробовали атрибут ['section'] (https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html)? Возможно, вы захотите изменить свой вопрос и уточнить, хотите ли вы помочь в его использовании; или, возможно, вы хотите альтернативное решение. – anatolyg

+1

ПЗУ не совпадает с разделом ОЗУ для чтения. – molbdnilo

ответ

3

Ваша постоянная переменная MY_VAR инициализируется результатом вызова функции. Это означает, что она не может быть инициализирована во время компиляции и, следовательно, не может быть помещена в ПЗУ. Инициализация выполняется во время запуска вашего приложения во время выполнения.

Невозможно создать предупреждение, если такие места размещения сделаны. В конце концов, вы сказали компилятору сделать это.

Вы можете, однако, создать компоновку ссылки и вручную проверить, действительно ли все ваши константы оказались в соответствующих сегментах.

+0

Чтобы указать, если он инициализирован функцией constexpr, это не проблема. – Flip

+1

@Flip Это правильно - функция 'constexpr', однако, не может иметь результат глобальной области видимости. – tofro

 Смежные вопросы

  • Нет связанных вопросов^_^