//透彻了解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();//不被inlining
printf("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;
};