使用Debug模式的结果为:
1.a的值为:12
2.b的值为:0
3.Press any key to continue
使用Release模式的结果为:
1.a的值为:12
2.b的值为:12
3.Press any key to continue
看看上面的运行结果我们发现在Release模式进行了优化之后b的值为了12,但是使用Debug模式的时候b的值为0。为什么会出现这样的情况呢?我们先不说答案,再来看看下面一段代码。注:使用vc6编译运行
1.#include
2.
3.void main() 4.{
5.int volatile a=12; 6.printf("a的值为:%d\n",a); 7.__asm {mov dword ptr [ebp-4], 0h}
8.int b = a; 9.printf("b的值为:%d\n",b); 10.}
使用Debug模式的结果为:
1.a的值为:12
2.b的值为:0
3.Press any key to continue
使用Release模式的结果为:
1.a的值为:12
2.b的值为:0
3.Press any key to continue
我们发现这种情况下不管使用Debug模式还是Release模式都是一样的结果。现在我们就来分析下,在此之前我们先说了Debug和Release 模式下编译方式的区别。
先分析上一段代码,由于在Debug模式下我们并没有对代码进行优化,所以对于在代码中每次使用a值得时候都是从它的内存地址直接读取的,所以在我们使用了__asm {mov dword ptr [ebp-4], 0h}语句改变了a的值之后,接下来使用a值的时候从内存中直接读取,所以得到的是更新后的a值;但是当我们在Release模式下运行的时候,发现b的值为a之前的值,而不是我们更新后的a值,这是由于编译器在优化的过程中做了优化处理。编译器发现在对a赋值之后没有再次改变a的值,所以编译器把a的值备份在了一个寄存器中,在之后的操作中我们再次使用a值的时候就直接操作这个寄存器,而不去读取a的内存地址,因为读取寄存器的速度要快于直接读取内存的速度。这就使得了读到的a值为之前的12。而不是更新后的0。