关于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
@@@@@@@@@@@@@@实验代码@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: const常量和#define的区别在于: 1. const常量是在编译时分配内存,而#define是在预处理时进行文本替换,不会分配内存。 2. const常量有类型,可以进行类型检查,而#define没有类型,只是简单的文本替换。 3. const常量可以进行地址取值操作,而#define不可以。 4. const常量可以在多个文件中共享,而#define只能在定义它的文件中使用。 5. const常量可以进行调试,而#define不可以。 因此,建议在定义常量时优先使用const,而不是#define。 ### 回答2: const常量是C++中常用的一种数据类型。定义了const常量之后,它的值不能改变,因此const常量也被称为“只读变量”。 定义const常量的语法格式如下: const 数据类型 常量名 = 常量值; 其中,const表示定义一个常量,数据类型指定了常量的类型,常量名指定了常量的名字,常量值则指定了常量的值。 与const常量类似的是#define宏定义,它们的区别在于前者是编译器处理的常量,后者是预处理器处理的常量。宏定义不会对常量进行类型检查,容易出现错误,在C++中往往使用const常量来代替宏定义。 const常量非常有用,它可以保证程序在运行过程中某些数值不被无意中修改。另外,const常量也可以作为参数传递给函数,这样可以避免函数中修改传入参数的值,增强程序的可读性和健壮性。在类中,const常量也可以用来声明成员变量,表示它的值在对象生命周期内不会改变。 总之,const常量是C++中非常重要的一种数据类型,它可以保证程序的安全性和稳定性,非常适合用于需要保证某些值不被随意修改的场合。 ### 回答3: let变量在JavaScript中的区别是什么? 在JavaScript中,const常量和let变量是两种常用的声明变量的方式。它们与var的不同之处在于它们在声明后具有不同的作用域和可变性。具体区别如下: 1. const常量:声明一个常量时,必须立即初始化常量的值,不能再次赋值。而且,const声明的常量是块级作用域,在声明的块级别内可见。此外,如果尝试重新分配const常量,将会引发TypeError错误。 2. let变量:初始化后,let声明的变量可以更改其值。与const一样,let变量也是在块级别的作用域中声明的,但是它在作用域中声明的变量可以被更改赋值。 总的来说,const常量和let变量在声明后都可以使用块级作用域,这意味着它们在声明块级别内可见,而不是在函数级别内。但是,const常量以初始化值之后不能进行赋值,同时,let变量可以被重新赋值。选择const还是let变量,需要根据实际需求和定义变量的用途来判断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值