前言
最近在复习c++ primer,把以前没注意到的都深入研究了一下。
此篇博客的结论都建立于c++11或者c++14的新标准上,编译器为VS2015 community版本,G++可能会有较大出入(这点笔者已经在其他博客上验证)
const和#define
宏
c语言中的宏机制被继承到了c++,宏是一种替换行为,而且是完全的字符替换,发生在预编译期,所以在这种机制下,编译期无法对宏进行任何的类型检查,我们来看汇编中,宏是如何实现的:
#define define_var 100
int temp_num = define_var;
008C6478 mov dword ptr [temp_num],64h
可以看到,宏本身是不分配任何内存的,而是在预编译时进行字符替换。
值得庆幸的是,现代的大多数IDE,都能在写代码阶段就判断程序员的大多数错误,当然也包括了宏内部的类型检查。
const
const被使用至今,已经从当初宏的替代品,发展成了一个很复杂的东西,特别是从c++11和14引入弱类型的特性(auto和delctype等关键字)后,const的使用稍不注意就会发生很多错误。
const是编译期的行为
const是一种编译期的行为,在编译期内,具有类型,会执行类型检测,所以他能由编译器指出程序在运行之前的错误,关于这点,我会在后面给出验证。
const声明占用内存
最初const和宏最大的区别可能就在于此,以前有种论调认为const声明的变量位于程序的符号表中,经笔者证明,并非是这样,或者说并非仅仅是这样。
至于const占用内存,我们可以从下面一段汇编中看出来: