首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

访问未初始化变量解决办法

2012-03-06 
访问未初始化变量//我菜鸟了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#includeiostream #includefstream #inclu

访问未初始化变量
//   我菜鸟了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

#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 啊……
这样就是一次与一百万次的差别了……

奇怪的是,他们说有些版本速度又是相同的,甚至没初始化更快……
这就无从解释了……

热点排行