HardBirch

C++处理const类型变量与C的不同

时间:09-09-13 栏目:系统技术篇 作者:鲁智森也有文化 评论:0 点击: 1,220 次

    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++处理const类型变量与C的不同

C++处理const类型变量与C的不同:等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐