Рассмотрим этот простой код:
void g();
void foo()
{
volatile bool x = false;
if (x)
g();
}
Вы можете видеть, что ни gcc
, ни clang
не оптимизируют потенциальный вызов g
. В моем понимании это правильно: абстрактная машина предполагает, что переменные volatile
могут изменяться в любой момент (например, из-за аппаратного отображения), поэтому постоянное свертывание инициализации false
в проверку if
будет неправильно.
Но MSVC полностью исключает обращение к g
(хотя чтение и запись в volatile
сохраняются!). Это стандартное поведение?
Background: I occasionally use this kind of construct to be able to turn on/off debugging output on-the-fly: The compiler has to always read the value from memory, so changing that variable/memory during debugging should modify the control flow accordingly. The MSVC output does re-read the value but ignores it (presumably due to constant folding and/or dead code elimination), which of course defeats my intentions here.
Редактирование:
Здесь обсуждается исключение операций чтения и записи в
volatile
: Разрешено ли компилятору оптимизировать локальную изменчивую переменную? (спасибо Натану!). Я думаю, что стандарт совершенно ясен, что эти чтения и записи должны произойти. Но это обсуждение не охватывает вопрос о том, является ли законным компилятор принимать результаты этих чтений как должное и оптимизировать их на этом основании. Я предполагаю, что это under-/не указано в стандарте, но я был бы счастлив, если бы кто-то доказал, что я неправ.Конечно, я могу сделать
x
нелокальной переменной, чтобы обойти проблему. Этот вопрос больше из любопытства.