条款02:尽量使用const、enum、inline替换define
文中说用enum代替define,只能说算是define在定义常量时的一种替代品,不能说明两者有何优劣。所以重点还是在const和inline vs define。
const vs define: 为什么建议用const而非define?
- define定义常量的局限性:
- 符号是否在编译器可见。define定义的常量在预处理阶段进行宏替换,符号在编译期将不可见。而const常量会在编译期进行类型检查、链接,相关符号存储在符号表中。
- const产生的额外开销很小:
- 首先说内存占用方面,const常量需要为其分配一个对象内存。当然,如果没有指针或引用对其进行解引用操作,优秀的编译器可以不为其分配内存。
- 访问开销。编译器会采用常量传播进行代码优化,即将const常量替换为具体的数值,这一点和define相似,没有额外的访问开销。
inline vs define: 为什么建议用inline而非define?
- 宏函数的问题。
- 每个符号都必须用括号括起来;
- 通过表达式传递可能会引起变量重复核算。具体示例如下:
#define MAX(a,b) (a)>=(b)?(a):(b)
a = 0, b = 1
MAX(++a,++b) // b将被核算两次
- inline产生的额外开销。一般对于短小的inline函数会在编译期进行内联展开,不会产生额外的函数调用开销。
经验准则
- 对于单纯常量,最好是以const对象或者enums替换#define。
- 对于形似函数的宏(macros)最好改用inline函数替换#define