Почему компилятор не может оптимизировать эти 2 утверждения? - PullRequest
5 голосов
/ 27 сентября 2010

Есть ли какая-либо причина, по которой компилятор не может оптимизировать следующие 2 утверждения в основном, даже если я включил полную оптимизацию в Visual C ++?Любой побочный эффект для доступа к переменной int в памяти?

int _tmain(int argc, _TCHAR* argv[])
{
    volatile int pleaseOptimizeMeOut = 100;

    (pleaseOptimizeMeOut);

    return 0;
}

Ответы [ 4 ]

16 голосов
/ 27 сентября 2010

Он не может оптимизировать их, потому что вы объявили переменную volatile. Загрузка и сохранение в volatile квалифицированных объектов являются частью «видимых извне» эффектов абстрактной машины C.

(Кстати, при доступе к переменной в памяти множество побочных эффектов; он может обновлять аппаратные кеши памяти, включая TLB, и, возможно, также вызывать сбои страниц. выполнение может быть отслежено другим процессом, например, отладчиком.

8 голосов
/ 27 сентября 2010

volatile явно указывает компилятору не оптимизировать эту переменную.

5 голосов
/ 27 сентября 2010

На некоторых компьютерах ввод / вывод устройства моделируется как чтение / запись в память. Это такая ситуация, когда volatile используется должным образом ... он явно указывает компилятору не предполагать, что операции с переменными не важны или могут быть оптимизированы ....

4 голосов
/ 27 сентября 2010

Другие ответы подчеркивали важность volatile здесь, и мне нечего добавить к этому.Однако я хочу сказать, насколько важно, чтобы такая конструкция существовала, потому что она полезна .Исходя из моего опыта проектирования аппаратного обеспечения, много раз интерфейс между процессором и логическим блоком в HW основывался на записи и чтении памяти.Это означает, что когда ЦП читает какой-либо регистр из HW, что-то происходит (то есть, очищение прерываний, продвижение очереди и многие другие параметры).

Теперь, когда вы выполните доступ к pleaseOptimizeMeOut, так как он volatile, компилятор просто предполагает, что вы могли сделать это только для побочного эффекта , так что это будет абсолютно неправильнооптимизировать это.Предположим, переменная сопоставлена ​​с HW-очередью, и вы просто хотели продвинуть очередь без фактического получения значения из нее.

Тем не менее, отображение переменных в регистры, когда чтение имеет побочные эффекты, ИМХО не является хорошей практикой, и было бы лучше инкапсулировать их с помощью вызова функции, именно по той причине, что ваш вопрос демонстрирует - это сбивает с толку в некоторыхслучаи.

Отображение переменных в регистры без побочных эффектов очень полезно и, тем не менее, .

...