почему изменчивые переменные не оптимизированы даже в очень простых случаях? - PullRequest
5 голосов
/ 24 ноября 2011

если я скомпилирую код

int main()
{
    int i;
    i = 1;
    i = 2;
}

в VS с релизом и оптимизацией разборка выглядит так:

int main()
{
    int i;
    i = 1;
    i = 2;
}
010D1000  xor         eax,eax 
010D1002  ret

но если я напишу слово "volatile":

int main()
{
01261000  push        ecx  
    volatile int i;
    i = 1;
01261001  mov         dword ptr [esp],1 
    i = 2;
01261008  mov         dword ptr [esp],2 
}
0126100F  xor         eax,eax 
01261011  pop         ecx  
01261012  ret   

Кто-нибудь знает, почему VS оставляет этот код? есть ли побочный эффект от этого? это единственный код в программе, так почему оптимизатор не может просто скинуть его?

Ответы [ 5 ]

11 голосов
/ 24 ноября 2011

С этой справочной страницы:

volatile - объект может быть изменен средствами, не обнаруживаемыми компилятором, и поэтому некоторые оптимизации компилятора должны быть отключены.

8 голосов
/ 24 ноября 2011

Если бы можно было оптимизировать изменчивые переменные, это бы как-то победило их цель, не так ли? Помещение volatile в var говорит компилятору, что вы знаете то, чего нет. Что-то может происходить с этим вар полностью не в рамках программы. Если компилятор оптимизирует это, это испортит эти планы.

5 голосов
/ 24 ноября 2011

Хорошо, потому что volatile сообщает компилятору, что переменная может быть доступна / изменена способами, которые не видны компилятору.Обычно используется во встроенном программном обеспечении, где, например, аппаратное прерывание может изменить значение переменной.

4 голосов
/ 24 ноября 2011

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

2 голосов
/ 24 ноября 2011

Если i сопоставлен с регистром на плате надстроек, компилятору будет очень плохо делать предположения о его содержимом.

i = 1;
i = 2;

Это может быть выдача команд на аппаратное обеспечение. Пропуск команды «1» может дать довольно плохие результаты.

...