--事物的难度远远低于对事物的恐惧!
在C语言中,我们经常看到宏代码块,使用宏代码块的作用是直接将代码直接在编译时就嵌到固定位置,那么有一个问题是:宏是简单粗暴的文本替换,并不会进行任何规则检查,在预处理期就完成宏的替换工作,编译器是不知道宏的存在的。
鉴于宏代码块的缺陷,C++中引入了内联函数替代宏代码块,使用inline关键字声明内联函数。需要注意的是:inline关键字必须与函数定义结合在一起,否则编译器会直接忽略内联请求
inline void fun() { //your code.... }
以上便是C++中内联函数的定义方式,C++编译器会将内联函数体直接插到程序中调用它的地方,没有普通函数调用是的额外开销(压栈、跳转、返回等),同时也能对内联函数的参数、等规则进行检查,这弥补了宏代码块的缺陷。
有一点需要注意的是:inline关键字只是请求C++编译器将这个函数当成内联函数,按照内联方式去编译,但是请求不一定成功,也就是即使用了inline关键字,但依旧是普通函数,依旧在使用时调用,有栈的开销等等。
但是在现在的C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译;如果 想要强制内联,可以采用如下的方式:
-g++ : __attribute__((always_inline)) void fun(){}
-MSVC : __forceinline void fun(){}
C++中inline内联编译的限制:
-不能存在任何形式的循环语句
-不能存在过多的条件判断语句
-函数体不能过于庞大
-不能对函数进行取址操作
-函数内联声明必须在调用语句之前
总而言之:内联函数不能过于复杂
总结:
-C++中可以通过inline声明内联函数
-编译器直接将内联函数体扩展到函数调用的地方
-inline只是一个请求,是否成功得看编译器允不允许内联
-内联函数弥补了宏代码块不进行规则检查的缺陷,同时也省去了函数调用时压栈、跳转和返回等开销