内联函数:
内联函数简单来说就是实现在编译时将函数的代码副本放在每个调用函数的地方.
内联函数存在的意义就是解决函数调用的效率问题. 避免了函数栈的开销, 以空间换时间. 但是也会存在代码膨胀的问题, 因此编译器会根据函数代码的长度来决定是否内联, 在类中定义的函数多于 1 行, 则忽略 inline 关键字; 同时在外部定义的内联函数超过 10 行左右也会被忽略 inline. 这种校正规则一定程度上减少了代码臃肿的问题.
宏定义:
在C语言中宏可以起到代码替换的作用, 这看似与内联函数有异曲同工之处, 但是我们知道, 宏的缺陷还是比较显著的, 首先是不能调试, 内联函数虽然本质上也是代码展开复制, 但是在 debug 下它并没有真的展开, 所以是能调试的, 在 release 下才展开; 其次是可读性太差, 尤其是对宏定义进行的是非原子操作时, 很容易出现与调用两边代码粘连, 产生不可预期的结果, 而内联函数则没有这种问题, 只需要在函数面前加一个 inline 关键字即可.
宏函数:
为什么要用do while(0) 这个结构, 是因为如果代码行数过多展开后会产生行错位, 这样函数中的代码周期就会产生影响, 因此这样做可以避免这个问题.
c++用inline, const, enum可以代替宏:
const:
在C语言中, const并不是真正的常量:
const修饰的值是可以通过指针间接修改的.
但是在 c++ 中, 同样的代码:
我们可以看到, const修饰的值是不允许改变的, 编译不通过.
inline和enum就不一一列举的.
内联函数的特性:
- inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使
用作为内联函数。 - inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等
等,编译器优化时会忽略掉内联。 - inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到