您的位置:首页 > 其它

关于Const常量内存使用

2009-09-10 09:20 253 查看
const与#define最大的差别,Const在堆栈分配了空间,而#define只是把具体数值

直接传递到目标变量罢了。或者说,const的常量是一个Run-Time的概念,他在程

序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概

念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参

数,没有实际的存在。

  @  const常量存在于程序的数据段。

  @  #define常量存在于程序的代码段。

我们要把这个问题分不同的编译器来看。

所以一般我们认为,Const常量是分配了内存空间的,而且只分配一次,在使用

Const常量时与使用变量的引用方式一样,如王san所讲『使用const常量还可以避

免目标码的多份复制。在程序中,仅有一个内存来存放常量』

但是根据编译器的不同,还略有不同。

◆C编译器

在C编译下,Const常量是完全分配了内存空间的,在使用时,是像变量一样来使

用的。参见以下实验代码。

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

3:    const int a = 100;

4:    main()

5:    {

7:        int x = a;

00401028   mov         eax,[_a (0041f01c)]

0040102D   mov         dword ptr [ebp-4],eax

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

◆C++编译器

为了提高程序的执行效率,c++的编译器通常不为普通const常量分配存储空间,而

是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内

存的操作,使得它的效率也很高,这时Const常量是和#define常量一样的。如李

san实验的结果一样『从汇编代码看,两种方法的汇编代码是相同的,所以目标码

多份复制好像也不成立』。

但是C++编译器对除了直接定义的Const常量外,都是分配内存的。所以,有以下来

那个两种情况。

1.分配内存的情况:

extern const int bufsz;   //外部声明

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

7:    #define TEST_DATA_DEF 100;

9:    extern const int  ccd;

14:     int a = TEST_DATA_DEF;

00401028   mov         dword ptr [ebp-4],64h

15:     int b = ccd;

0040102F   mov         eax,[ccd (0042201c)]

00401034   mov         dword ptr [ebp-8],eax

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

2. 不分配内存的情况:

const int bufsz  = 100; //全局常量

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

12:       const int  test = 100;

0040D758   mov         dword ptr [ebp-4],64h

13:       int x = ccd;

0040D75F   mov         dword ptr [ebp-8],64h

@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: