我写了一个简单的循环:
int volatile value = 0;
void loop(int limit) {
for (int i = 0; i < limit; ++i) {
++value;
}
}
Run Code Online (Sandbox Code Playgroud)
我用gcc和clang(-O3 -fno-unroll-loops)进行了编译,得到了不同的输出。它们++value部分不同:
铛:
add dword ptr [rip + value], 1 # ++value
add edi, -1 # --limit
jne .LBB0_1 # if limit > 0 then continue looping
Run Code Online (Sandbox Code Playgroud)
gcc:
mov eax, DWORD PTR value[rip] # copy value to a register
add edx, 1 # ++i
add eax, 1 # increment a copy of value …Run Code Online (Sandbox Code Playgroud)