Dan*_*iel 4 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;
}
Run Code Online (Sandbox Code Playgroud)
一位同学指出,我们没有明确告知输出结果,结果导致了
int main()
{
float celsius;
cout << "Enter Celsius temperature: ";
cin >> celsius;
celsius * (9.0 / 5) + 32;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用它作为一个轶事:在指定要求时总是要彻底
最近我一直在想这个代码是否确实满足了要求.
celsius * (9.0 / 5) + 32;在死代码消除期间,编译器不会排除该部分吗?代码是在Visual Studio 2010中编译的,没有任何特定的编译器选项.
查看Visual Studio反汇编语句似乎不会生成任何代码,但同样,该语句也不会生成float celsius;.
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
Run Code Online (Sandbox Code Playgroud)