0x01 const & define区别
宏定义#define发生在预编译期,而const,enum定义的常量发生在编译期,两者的重要差别在于编译期里的变量是进符号表的,而预编译期的宏是简单的替换,不进符号表。
宏#define没有数据类型,只是用来做文本替换,存在于程序的代码段,是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。
const常量有数据类型,在堆栈分配了空间,存在于程序的数据段,是一个Run-Time的概念,在程序中确确实实的存在可以被调用、传递。
0x02 优缺点
const优点:
1.const有数据类型,define语句没有数据类型,不进行安全检查的特点是有风险的.
2.const支持访问权限,可以把这些常量放在类中,从而避免了全局的作用域,而宏定义只能是全局的
define的作用:
1.在头文件中使用 #define 可以避免头文件重复包含的问题
# define CODER # ifdef CODER ..... # endif
0x03 define & inline区别
函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销,所以调用一个宏比调用一个函数更有效率。
然而宏定义define不能进行参数的有效性检查,不能享受C++编译器严格的参数类型检查,另外,它的返回值也不能被强制转换为可转换的合适类型,因此它的使用存在着一系列的隐患和局限性。
内联函数和宏很类似,而本质区别在于:宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
inline函数的好处:
获得宏带来的效率(宏没有函数调用带来的额外开销);
一般函数的所有可预料行为和类型安全性(type safety);