为什么编译器似乎对不执行任何操作的循环很有礼貌,而且不会消除它们?
C标准是否要求循环需要花费一些时间?
例如,以下代码:
void foo(void) {
while(1) {
for(int k = 0; k < 1000000000; ++k);
printf("Foo\n");
}
}
比这个运行得慢:
void foo(void) {
while(1) {
for(int k = 0; k < 1000; ++k);
printf("Foo\n");
}
}
即使启用了-O3
优化级别,我仍然希望删除空循环并在两个代码上获得相同的速度。
"时间消耗"是编译器应该保留的副作用吗?