const和define的区别以及const的优点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YL970302/article/details/88916973

一、const和define的区别

(1)就起作用的阶段而言:#define是在编译的预处理阶段起作用(在预处理阶段进行替换),而const是在编译运行的时候起作用(const修饰的只读变量是在编译的时候确定其值)

(2)就起作用的方式而言:#define只是简单的字符串替换,没有类型检查。而const有对应的类型,是要进行判断的,可以避免一些低级的错误

(3)就存储方式而言:#define只是进行展开,有多少地方使用,就替换多少次。它定义的宏常量在内存中存若干个备份;const定义的只读变量在程序中只有一份备份

(4)从代码调试的方便程度而言:const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经进行替换了

(5)就内存分配而言:编译器通常不为普通的const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高

#define M 3
const int N = 5;  //此时并未将N放入内存中

int i = N;此时为N分配内存,以后不再分配
int l = M;//预编译期间进行宏替换,分配内存
int j = N;//没有内存分配
int J = M;//再进行宏替换,又一次分配内存

  const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。

二、const的优点

(1)const常量有数据类型,而宏常量没有数据类型,编译器可以对const进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误

(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试

(4)const在内存中只存储了一份,节省了空间,避免不必要的内存分配,提高了效率

猜你喜欢

转载自blog.csdn.net/YL970302/article/details/88916973
今日推荐