C++ inline的使用和含义详解
用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内
联函数就需要建立栈帧了,就可以提高效率。
#include<iostream>
using namespace std;
inline int Add(int x, int y)
{
int ret = x + y;
ret += 1;
ret += 1;
ret += 1;
return ret;
}
int main()
{
// 可以通过汇编观察程序是否展开
// 有call Add语句就是没有展开,没有就是展开了
int ret = Add(1, 2);
cout << Add(1, 2) * 5 << endl;
return 0;
}
通过汇编观察程序发现没有展开
原因是在于我们使用的是debug版本的
为了方便调试,便不进行展开
如此图
没有call Add语句
因此进行了展开,从而避免了调用,提高了效率
inline对于编译器而言只是一个建议,也就是说,你加了inline编译器也可以选择在调用的地方不展
开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。
inline适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline也会被编译
器忽略。
C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调
试,C++设计了inline目的就是替代C的宏函数。
vs编译器 debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下
以下两个地方。
inline不建议声明和定义分离到两个文件,分离会导致链接错误。
因为inline被展开,就没有函数地址,链接时会出现报错。
当然
展开也具有缺陷性
如下图所示
展开有概率使内存变大
如果一个游戏内存过大,想想也产生了抗拒的心里吧