【发布时间】:2016-08-17 06:53:43
【问题描述】:
为什么编译器似乎对什么都不做也不消除它们的循环有礼貌?
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 优化级别。
我希望删除允许的空循环,从而在两个代码上获得相同的速度。
“所花费的时间”是应该由编译器保留的副作用吗?
【问题讨论】:
-
什么是粗鲁的编译器?
-
我认为 C/C++ 标准没有任何“运行时间”的概念。
-
粗鲁的编译器是一种非常注意将代码中的任何“未定义行为”变成最糟糕的噩梦的编译器。
-
这是一个关于 as-if 规则以及什么是可观察行为的体面问题。
-
您只是测量启动开销或其他难以预测的开销。基本上是随机数。在提出此类问题之前,您应该咨询反汇编。
标签: c++ c language-lawyer compiler-optimization