 点蓝色字关注“CurryCoder”
点蓝色字关注“CurryCoder”
微信公众号:CurryCoder的程序人生
怕什么真理无穷,进一寸有一寸的欢喜

1.inline函数的爱恨两难
内联函数比宏优点好很多,详细原因请参见尽量以const、enum、inline替换#define 。调用内联函数不需要承受函数调用所导致的额外内存开销,编译器最优化机制通常被设计用来浓缩那些“不含函数调用”的代码,所以当一个函数为内联函数时,或许编译器就因此有内联对其执行语境相关的最优化。“世界上没有免费的午餐”,内联函数背后的整体思想是:对一个函数的调用都以函数本体替换它,但这同时会增加你的目标码大小。在一个内存有限的机器上,过度使用内联函数会造成程序体积太大。即使用有虚拟内存,内联函数造成的代码膨胀也会导致额外的换页行为,降低指令高速缓存器的命中率。另一方面来说,如果内联函数的本体很小,编译器针对函数本体所产生的码可能比函数调用所产生的码更小。因此,将函数设置为inline,确实导致更小的目标码和较高的命中率。2.inline函数卑微在线求助
inline只是对编译器的一个申请建议,不是强制命令,编译器可以选择对你的建议置之不理。这项申请可以隐式声明也可以显式声明,隐式声明是将函数定义在类的内部,如下所示:class Person{
public:
    // ...
    int age() const {return mAge;}   // 隐式的内联函数
private:
    int mAge;
};
template<typename T>
inline const T& max(const T& a, const T& b){
    return a }
大部分编译器拒绝将太复杂(带有循环或递归、switch-case语句)的函数设置为inline,而且所有对虚函数的调用也都会使inline失效。这是因为虚函数是直到运行期才会确定调用哪个函数,而inline函数意味着执行前先把调用动作替换为被调用函数的本体,编译器工作在编译期。如果编译器都不知道该调用哪个函数,你也就明白了为啥虚函数不建议设置为inline。更多详情原因请看这里https://www.jianshu.com/p/84a8335444dd
4.糟糕的内联选择:构造函数与析构函数不要被你的眼睛所欺骗,下面子类构造函数真的是空的吗???
class Base{
public:
    // ...
private:
    string bm1, bm2;
};
class Derived: public Base{
public:
    Derived(){}  // Derived构造函数真的是空的吗???
    // ...
private:
    string dm1, dm2, dm3;
};
Derived::Derived(){
    Base::Base();
    try{
        dm1.string();
    }
    catch(...){
        Base::~Base();
        throw;
    }
    try{
        dm2.string();
    }
    catch(...){
        dm1.string();
        Base::~Base();
        throw;
    }
     try{
        dm3.string();
    }
    catch(...){
        dm2.string();
        dm1.string();
        Base::~Base();
        throw;
    }
}
觉得不错,请一键三连吧↓↓↓