Рассмотрим этот простой код:
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нелокальной переменной, чтобы обойти проблему. Этот вопрос больше из любопытства.