//透彻了解inlining的里里外外
//inline函数看起来像函数,行为像函数,比宏好得多,可以免除调用函数的开销。
//过度使用inline函数,导致程序体积过大,代码膨胀导致额外的换页行为,降低指令高速缓存的击中率。//如果inline函数本体很小,编译器所产出的码比函数调用的码更小,就适合inline函数。//inline只是对编译器的一个申请,不是强制命令。//inline大多数C++程序中是编译期行为。//大部分编译器将拒绝太过复杂(循环或递归)的函数inlining。//virtual意味着等待,知道运行期才能确定,而inlining是编译器行为。#include "stdafx.h"
#include "string"template<typename T>
inline const T& max(const T& a, const T& b) //明确申请inline{ return a < b ? b : a;}inline void f() {} //编译器有意愿inlining
int main()
{ void (*pf)() = f; //pf函数指针//编译器有意愿inlining函数,但是还是会为该函数生成一个函数本体
//取内联函数的地址,但是inline函数是不存在本体的,只能生成函数本体 //编译器可能隐式使用inline函数的地址 f();//inlining pf();//不被inliningprintf("Hello World!\n");
return 0;//谨慎使用内联,等于把自己推向手工最优化道路。
//将大多数inling限制在小型,被频繁调用的函数身上。
//不要只因为function templates出现在头文件,就将他们声明为inline。}class Base
{ public:private: std::string bm1, bm2;};class Derived :public Base
{ public: //如果有个异常在构造函数抛出,已经构造好的部分会自动销毁 Derived() {}//构造函数是空的?适合inline?(不会,其实编译器会生成很多代码,最好不要内联) ~Derived() {}//析构函数也一样private: std::string dm1, dm2, dm3;};