如果算术运算的结果没有存储在内存

时间:2016-09-20 15:53:01

标签: c++ compiler-optimization

5年前我在学习C ++时,其中一项任务是

  

创建一个程序,使用公式 C°x 9/5 + 32 = F°

,根据摄氏度输入计算华氏温度

我们的第一个版本是这样的

int main()
{
    float celsius;
    cout << "Enter Celsius temperature: ";
    cin >> celsius;
    cout << "Fahrenheit: " << celsius * (9.0 / 5) + 32 << endl;
    return 0;
}

一位同学指出,我们没有明确告知输出结果,导致

int main()
{
    float celsius;
    cout << "Enter Celsius temperature: ";
    cin >> celsius;
    celsius * (9.0 / 5) + 32;
    return 0;
}

我将此用作轶事:在指定要求时始终彻底

最近我一直想知道这段代码是否确实符合要求。

编译器在死代码消除期间不会排除celsius * (9.0 / 5) + 32;部分吗?代码是在Visual Studio 2010中编译的,没有任何特定的编译器选项。

查看Visual Studio反汇编语句似乎没有生成任何代码,但是float celsius;语句也没有。

C ++代码和相应的反汇编

     7:     float celsius;
     8:     cout << "Enter Celsius temperature: ";
 push        offset string "Enter Celsius temperature: " (01368B30h)  
 mov         eax,dword ptr [_imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A (0136C098h)]  
 push        eax  
 call        std::operator<<<std::char_traits<char> > (01361370h)  
 add         esp,8  
     9:     cin >> celsius;
 mov         esi,esp  
 lea         eax,[celsius]  
 push        eax  
 mov         ecx,dword ptr [_imp_?cin@std@@3V?$basic_istream@DU?$char_traits@D@std@@@1@A (0136C09Ch)]  
 call        dword ptr [__imp_std::basic_istream<char,std::char_traits<char> >::operator>> (0136C0A0h)]  
 cmp         esi,esp  
 call        __RTC_CheckEsp (0136114Fh)  
    10:     celsius * (9.0 / 5) + 32;
    11:     return 0;
 xor         eax,eax  

2 个答案:

答案 0 :(得分:8)

是的,看起来编译器优化了该语句。我打赌,如果您使用volatile float celsius;,您会看到代码!

答案 1 :(得分:3)

如果没有使用计算结果(并且编译器可以证明这个),那么它将完全消除计算。 至少如果它是一个非垃圾编译器。

未经优化的调试版本当然是例外。