【发布时间】:2014-04-22 11:38:16
【问题描述】:
让我们假设C++ for 循环的形式为:
for(int i; i<10;i++)
所以整数需要在开始时分配,然后在每一步增加以及比较。那么做这样的事情不是更快吗:
f or(int i; i++<10;)
因为变量不需要再次加载到存储中?尤其是当volatile?
这个小示例代码在所有情况下都给出了相同的结果。 for 循环是否得到了优化,还是我遗漏了什么?
#include<iostream>
#include<ctime>
int main() {
time_t start,ende;
volatile int dummy = 1;
const int rep = 1000000000;
// Method 1
start = time(0);
for (int i = 0; i < rep; i++)
dummy = 1;
ende = time(0);
std::cout << "Method 1: " << difftime(ende,start)*1000 << " ms" << std::endl;
// Method 2
start = time(0);
for (int i = 0; i++ < rep; )
dummy = 1;
ende = time(0);
std::cout << "Method 2: " << difftime(ende,start)*1000 << " ms" << std::endl;
// Method 3
start = time(0);
for (volatile int i = 0; i < rep; i++)
dummy = 1;
ende = time(0);
std::cout << "Method 3: " << difftime(ende,start)*1000 << " ms" << std::endl;
}
操作系统:Linux 编译器:g++ 优化:标准(无标志)
【问题讨论】:
-
没有优化的分析是没有意义的,打开优化并从中得出结论。
-
你为什么用
volatile? -
@LuchianGrigore。我也用 O3 进行了跑步,没有任何改变。我不想太快下结论,所以才在这里问
-
@KarolyHorvath。这个想法是为了确保它确实会通过 for 循环运行,而不是简单地检测到没有任何变化,因此只是简单地缩短它。
-
编译器很可能会优化掉那些循环。