访问未初始化变量
// 我菜鸟了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include "iostream "
#include "fstream "
#include "string "
#include "windows.h "
#include "mmsystem.h "
#pragma comment(lib, "winmm.lib ")
using namespace std;
int main()
{
float t = 0; // 如果把 = 0去掉,就是不初始化,结果
float n; // 显示的速度慢了10倍左右,为什么呢?
DWORD s = 0;
DWORD d = 0;
s = timeGetTime();
for (int i = 0; i < 1000; ++i)
for (int j = 0; j < 1000; ++j)
n += t;
d = timeGetTime();
cout < <d - s < <endl < <n < <endl;
return 0;
}
ps:要用release编
高手不要拍我啊
为什么变量为初始化的话,访问起来慢这么多,是不是编译器优话的问题
纯疑问,没实际意义的贴子:)
[解决办法]
但是测试速度差异的是 Release 版本。对为初始化变量, Debug 版的处理会弹一个警告框的,应该就是这段代码弹的。Release 版没有这些代码。
我发现这个问题和变量是否初始化没有关系,只和变量的初始值有关系。
大家可以这样试试,先不初始化,但是把 t 和 n 的值打印记录下来。然后把 t 和 n 初始化为记下来那个值在运行,你会发现这两种情况下的时间是差不多的。
[解决办法]
Chiyer (星羽) 兄也有难题啊
其实也没什么的,浮点数本来就和整形什么的不一样
[解决办法]
for (int i = 0; i < 1000; ++i)
for (int j = 0; j < 1000; ++j)
n += t;
如果t在这个循环之前被初始化为0,那么这个循环执行完毕后所产生的结果是固定的(这个结果就是:n被赋值为1.26739e+034)。编译器在编译这个循环时就可以做进一步的优化(编译期求值)。也就是说,这个循环其实会被当作 n = 1.26739e+034; 来编译。
如果t没有初始值,那么在编译期,这个循环所产生的结果是无法预料的(因为t的值要到运行期才能确定)。编译器也就无法执行编译期优化,只能老老实实地按照循环来给你编译。
可想而知,一条赋值语句和 1000 * 1000次 += 操作,那个快????
[解决办法]
但是可以n += 1.26739e +034 啊……
这样就是一次与一百万次的差别了……
奇怪的是,他们说有些版本速度又是相同的,甚至没初始化更快……
这就无从解释了……