Почему компилятор не может оптимизировать эти два оператора?

StackOverflow https://stackoverflow.com/questions/3800890

Вопрос

Есть ли какая-либо причина, по которой компилятор не может оптимизировать следующие два оператора в 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 компилятор просто предполагает, что вы могли это сделать просто ради побочного эффекта, поэтому оптимизировать его было бы абсолютно неправильно.Предположим, переменная сопоставлена ​​с аппаратной очередью, и вы просто хотели продвинуть очередь вперед, фактически не беря из нее значения.

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

Сопоставление переменных с регистрами без побочных эффектов является однако очень полезный и широко используемый.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top