前言0x00 函数与带参宏比较0x01 inline函数0x02 内联编译选项0x03 内联函数写法参考
前言
内联函数是C++为提高程序运行速度所做的一项改进。在C语言中,使用带参宏来模拟函数调用,本质上是在预处理时进行宏替换来实现特定的功能。
0x00 函数与带参宏比较
编译过程的最终产品是可执行程序(一组机器语言的指令组成)。程序运行时,操作系统将这些指令载入到内存中,每条指令对应特定的内存地址。CPU从内存中取指令、分析指令、执行指令。
如果有循环或分支语句时,将跳过一些指令,向前或向后跳转到特定的地址执行对应的指令。对于普通的函数调用,使程序跳到另一个地址(函数实现代码处)执行,并在函数结束时返回。对于函数调用这一过程,需要将参数入栈、函数调用结束以后的返回地址入栈、寄存器入栈(保存寄存器环境)。总之,函数调用需要一定的开销。
C语言中,通过带参宏在预处理时进行了宏替换,省去了函数调用过程的开销。
| item | Value | 缺点 |
|---|---|---|
| 函数 | 节省内存空间、维护性好 | 性能低 |
| 带参宏 | 性能高,维护性好 | 占用内存空间,无类型信息 |
关于函数节省内存空间与宏占用内存空间:
void fun()
{
char buf[100000];
cout << "fun" << endl;
}
#define FUN() {char buf[100000]; cout << "fun" << endl;}
void main()
{
FUN();
FUN();
FUN();
}
如果是函数调用,函数调用时开辟栈空间,调用结束后归还栈空间。而如果是无参宏调用,预处理会直接将代码移动到调用初,main函数占用空间太大。
0x01 inline函数内联函数的编译代码与函数调用前后的代码“内联”起来,编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需函数调用过程的开销,因此内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。
应该有选择的使用内联函数。如果执行函数代码的时间比处理函数调用机制的时间常,则节省的时间将只占整个过程的很小一部分。如果代码执行时间很短,则内联调用就可以节省非内联调用使用的大部分时间。
0x02 内联编译选项debug不内联,release才有可能内联。release版本要看编译选项
/Ob0:禁用内联
/Ob1:有inline关键字的函数才会内联
/Ob2:所有函数都内联。默认值。
编译选项默认是所有的都内联。
内联函数只需要在函数声明前或者在函数定义前加上 inline 关键字。
通常的做法是省略原型,将整个定义(函数头和函数代码)放在本应提供原型的地方。也就是说要么将内联函数写在源文件中,要么写在头文件中。不可以定义写在头文件中,实现写在源文件中。
inline int Add(int n1, int n2)
{
return n1 + n2;
}
参考
[1] C++ Primer Plus中文版 :第6版 /(美)普拉达(Prata,S.)著;张海龙,袁国忠译. – 北京 :人民邮电出版社



