关于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 @@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
相关文章推荐
- 关于const常量的内存分配问题
- 关于c++在内存布局意义下使用派生类指针访问基类
- iOS 宏(define)与常量(const)的正确使用
- 从 VCL 中吸取营养--使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
- 关于const变量何时分配内存的两个要点
- 关于 #define 和 const 定义常量所回想起的问题
- 关于 free 命令显示内存使用情况问题
- kbmMemTable关于内存表的使用,以及各种三层框架的评价
- 关于“Damage:before normal block..."(内存的使用错误)
- 关于Java Logger类的使用问题 - 内存不释放
- 使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
- 关于使用子函数里分配的内存的一个体会
- 关于const的使用
- 使用多窗体时, 关于节约内存和加快启动速度的思考与尝试
- 数据结构 学习笔记之:关于顺序栈中给结构体类型指针分配内存时,使用malloc和不使用malloc的疑惑之解惑!
- 正确使用iOS常量(const)、enum以及宏(#define)
- 关于c和CPP下对于const 常量的问题
- C++ 关于static_cast reinterpret_cast dynamic_cast 以及 const_cast 用于类型转换的函数使用 20180315 day7
- pch文件的使用, 头文件使用, 常量(const)的定义,以及一些常用的宏定义
- 关于block的回调使用-防止内存泄露问题