正如标题所说,
一个典型的答案是:
允许任何和所有代码转换不会改变程序的可观察行为的规则
我们会不时地从某些实现中获取行为,这些行为归因于此规则.好多次错了.那么,这个规则究竟是什么呢.标准没有明确地将此规则作为一个部分或段落提及,那么究竟什么属于这条规则的范围?对我来说,这似乎是一个灰色区域,标准没有详细定义.有人可以根据标准的参考资料详细说明细节.
注意:将其标记为C和C++,因为它与两种语言都相关.
double var = 0.;
for(int i = 0; i < 1000000 ; i++)
{
var += sqrt(2.0);
}
std::cout << var << std::endl;
Run Code Online (Sandbox Code Playgroud)
在MSVC2012下,是否有可能在优化开启的情况下,sqrt(2.0)将被调用的值替换,而不是称之为1*10 ^ 6次?
Asm看起来像这样,不确定它的解释:
; Line 6
push ebp
mov ebp, esp
sub esp, 84 ; 00000054H
push ebx
push esi
push edi
; Line 8
movsd xmm0, QWORD PTR __real@0000000000000000
movsd QWORD PTR _var$[ebp], xmm0
; Line 9
mov DWORD PTR _i$1[ebp], 0
jmp SHORT $LN3@main
$LN2@main:
mov eax, DWORD PTR _i$1[ebp]
add eax, 1
mov …Run Code Online (Sandbox Code Playgroud)