Почему компилятор не может оптимизировать эти два оператора?
-
25-09-2019 - |
Вопрос
Есть ли какая-либо причина, по которой компилятор не может оптимизировать следующие два оператора в main, даже если я включил полную оптимизацию в Visual C++?Какой-нибудь побочный эффект для доступа к переменной int в памяти?
int _tmain(int argc, _TCHAR* argv[])
{
volatile int pleaseOptimizeMeOut = 100;
(pleaseOptimizeMeOut);
return 0;
}
Решение
Это не может их оптимизировать, потому что вы объявили переменную быть volatile
. Отказ Грузы и магазины для volatile
Квалифицированные объекты являются частью «видимых внешних» эффектов аннотации C.
(Кстати, есть множество побочных эффектов при доступе к переменной в памяти; Он может обновить аппаратные кэши памяти, включая TLB, и, возможно, также вызывают неисправности страницы. И память вашего процесса выполняется, может быть включено другим процессом, как отладчик).
Другие советы
volatile
Явно говорит компилятору не оптимизировать для этой переменной.
На некоторых компьютерах устройство ввода / вывода моделируется как запись / пишет памяти. Это такая ситуация, когда правильно используемая ситуация ... это говорит о компилятору явно не предположить, что переменные операции не важны или могут быть оптимизированы ....
В других ответах подчеркивалась важность volatile
здесь, и мне нечего добавить к этому.Однако я хочу сказать, насколько важно, чтобы такая конструкция существовала, потому что она является полезный.Судя по моему опыту проектирования аппаратного обеспечения, интерфейс между ЦП и логическим блоком в аппаратном обеспечении часто основан на записи и чтении памяти.Это означает, что когда ЦП считывает какой-либо регистр из аппаратного обеспечения, что-то происходит (т.очистка прерываний, перемещение вперед по очереди и многие другие параметры).
Теперь, как только вы выполните доступ к pleaseOptimizeMeOut
, поскольку это volatile
компилятор просто предполагает, что вы могли это сделать просто ради побочного эффекта, поэтому оптимизировать его было бы абсолютно неправильно.Предположим, переменная сопоставлена с аппаратной очередью, и вы просто хотели продвинуть очередь вперед, фактически не беря из нее значения.
Тем не менее, сопоставление переменных с регистрами, когда чтение имеет побочные эффекты, по моему мнению, не является хорошей практикой, и было бы лучше инкапсулировать его с помощью вызова функции именно по той причине, по которой демонстрирует ваш вопрос - в некоторых случаях это сбивает с толку.
Сопоставление переменных с регистрами без побочных эффектов является однако очень полезный и широко используемый.