最近发现一个奇怪的事情。用 -O2 编译这个代码:
int p; char a[50000005]; int main() {while (a[p]) a[p]--;}
编译结果是这个东西,可以看到循环并没有被优化掉:
main:
movsx rax, DWORD PTR p[rip]
cmp BYTE PTR a[rax], 0
je .L2
mov BYTE PTR a[rax], 0
.L2:
xor eax, eax
ret
a:
.zero 50000005
p:
.zero 4
在循环后面又加了一句,如下
int p; char a[50000005]; int main() {while (a[p]) a[p]--; a[p]++;}
这个时候循环反而被优化掉了。这是为什么呢?
main:
movsx rax, DWORD PTR p[rip]
mov BYTE PTR a[rax], 1
xor eax, eax
ret
a:
.zero 50000005
p:
.zero 4