以下代码将从一个被解释为浮点数的零数组复制到另一个数组中,并打印出操作的时间。我曾经看过许多情况下,包括gcc在内的编译器都会优化掉无操作循环,因此我一直期待着在更改我的复制数组程序的某个时刻它将停止进行复制。
我使用 g++ 4.8.1 命令
我还尝试将数组的创建方式从
看来编译器认为这段代码不会执行任何有意义的操作,那么为什么它没有优化掉循环呢?
#include <iostream>
#include <cstring>
#include <sys/time.h>
static inline long double currentTime()
{
timespec ts;
clock_gettime(CLOCK_MONOTONIC,&ts);
return ts.tv_sec+(long double)(ts.tv_nsec)*1e-9;
}
int main()
{
size_t W=20000,H=10000;
float* data1=new float[W*H];
float* data2=new float[W*H];
memset(data1,0,W*H*sizeof(float));
memset(data2,0,W*H*sizeof(float));
long double time1=currentTime();
for(int q=0;q<16;++q) // take more time
for(int k=0;k<W*H;++k)
data2[k]=data1[k];
long double time2=currentTime();
std::cout << (time2-time1)*1e+3 << " ms\n";
delete[] data1;
delete[] data2;
}
我使用 g++ 4.8.1 命令
g++ main.cpp -o test -std=c++0x -O3 -lrt
进行编译。此程序在我的机器上打印出6952.17 ms
(我需要设置 ulimit -s 2000000
才能避免崩溃)。我还尝试将数组的创建方式从
new
更改为自动 VLAs,去除了memset
,但这并未改变 g++ 的行为(除了将时间减少了几倍)。看来编译器认为这段代码不会执行任何有意义的操作,那么为什么它没有优化掉循环呢?
new
但没有delete
。 - deviantfan