Есть ли способ сообщить компилятору (здесь gcc), что он не должен оптимизировать переменные, которые он считает константами, в константные выражения? В общем, с помощью флага компилятора или, что еще лучше, с помощью атрибута для конкретной переменной?
Я хочу, чтобы (локальная) переменная действительно существовала, каждое чтение этой переменной действительно выполнялось, а также каждая запись, даже если я снова запишу одно и то же значение.
Он всегда будет загружать/сохранять переменную из/в ОЗУ, если я не оптимизирую. То же самое, если я объявлю его изменчивым. Однако я хочу, чтобы ее можно было хранить в регистре, как обычную переменную, которая не является ни постоянной, ни изменчивой. Полностью отключить оптимизацию тоже не вариант.
Пример кода (r(a) и r(b) — любой регистр):
int a, b;
a = 2;
a = 2;
b = a;
Результат (при условии, что b понадобится позже, a не больше):
Игнорируемая строка
Игнорируемая строка
Перемещает 2 в r(b)
a заменяется константным выражением 2
volatile int a;
int b;
a = 2;
a = 2;
b = a;
Результат (b понадобится позже, a не имеет значения):
Перемещает 2 в r2, помещает адрес a в r3, записывает r2 в RAM(r3)
Записывает r2 снова в RAM(r3)
Считывает RAM(r3) в r4
Помещает адрес b в r5, записывает r4 в RAM(r5)
Как видите, это очень неэффективно. Что я хочу:
Переместить 2 в r(a)
Переместить 2 снова в r(a)
Записать r(a) в r(b)
Если регистры нужны для чего-то еще, сохранить a и b в оперативной памяти
Именно это и произошло бы, если бы a была реальной переменной, а не просто 2.
-O0
удалит все оптимизации. Обратите внимание, что, возможно, эта оптимизация является стандартной, поэтому GCC сделает это, когда бы то ни было. Предоставьте минимально воспроизводимый пример. - person Stargateur   schedule 20.12.2016volatile
не обязательно означает, что переменная не может быть помещена в регистр. С точки зрения стандарта C, он ничего не говорит ничего о том, где он может храниться. Вы даже можете указать переменную какregister volatile
, если хотите - person tofro   schedule 20.12.2016register volatile
на самом деле не означает, что он должен храниться в оперативной памяти, не так ли? Однако вы не можете принудительно поместить переменную в регистр.register
это только намек. - person tofro   schedule 20.12.2016