两者的区别(const的3个优势和2个不一样)
1.编译器处理方式不同
- #define 宏是在预处理阶段展开。
- const 常量是编译运行阶段使用。
2.类型和安全检查不同
- #define 宏没有类型,不做任何类型检查,仅仅是展开。
- const 常量有具体的类型,在编译阶段会执行类型检查。
3.存储方式不同
- #define宏仅仅是展开,有多少地方使用,就展开多少次,存储于只读存储区。
- const常量不会影响变量的存储区,可以是栈,也可以是全局存储区,还可以是堆。
4.const 可以节省空间,避免不必要的内存分配
#define NUM 3.14159 //常量宏 const doulbe Num = 3.14159; //此时并未将Pi放入ROM中 ...... double i = Num; //此时为Pi分配内存,以后不再分配! double I= NUM; //编译期间进行宏替换,分配内存 double j = Num; //没有内存分配 double J = NUM; //再进行宏替换,又一次分配内存!
- const 定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象 #define 一样给出的是立即数,所以,const 定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define 定义的常量在内存中有若干个拷贝。
5.提高编译效率。
- 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高