这个问题是这个问题的后续问题: Question on Undefined Behaviour (UB) and loop optimization
当使用https://godbolt.org/在线编译器(g ++ 7.2,x86_64)并设置-O2
时,循环条件会在循环包含std::cout
但不使用{printf
的相同循环时优化出来1}}。
知道为什么吗?两个代码版本都使用C ++编译器编译。两个版本都会产生UB警告,但没有-O2就没有警告,即使代码仍在UB中。
FWIW,我也尝试过MIPS g ++编译器,即使使用std::cout
代码版本和-O2
,也似乎没有优化循环条件。
如果需要,我可以提供编译器输出,但std::cout
版本很长。
#include <stdio.h>
int main()
{
for (int i = 0; i < 300; i++)
printf("%d %d", i, i*12345678);
}
/*#include <iostream>
int main()
{
for (int i = 0; i < 300; i++)
std::cout << i << " " << i * 12345678 << std::endl;
}*/
更新:根据评论的建议,我删除了UB,然后甚至printf版本删除了循环条件,而是在我11岁时跳出循环(非常不足为奇),见下文:
#include <stdio.h>
int main()
{
for (int i = 0; i < 300; i++) {
printf("%d %d", i, i*123);
if (i * 123 > 1230) break;
}
}
//生成的程序集:
LC0:
.string "%d %d"
main:
push rbp
push rbx
xor edx, edx
xor esi, esi
mov edi, OFFSET FLAT:.LC0
xor eax, eax
sub rsp, 8
mov ebp, 123
xor ebx, ebx
call printf
.L2:
add ebx, 1
mov edx, ebp
xor eax, eax
mov esi, ebx
mov edi, OFFSET FLAT:.LC0
add ebp, 123
call printf
cmp ebx, 11
jne .L2
add rsp, 8
xor eax, eax
pop rbx
pop rbp
ret