关于Const常量内存使用

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
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

你可能感兴趣的:(c,汇编,存储,编译器)