谈一下inline:
主要分析下“你眼中”的inline跟“编译器眼中”的inline有什么区别。
1. 类外的inline函数
#include<iostream>
using namespace std;
int i = 0;
inline void fun1()
{
if (i<100)
{
i++;
fun1();
}
}
inline int fun2(int n)
{
return n;
}
int main()
{
fun1();
fun2(1);
return 0;
}
编译: g++ -O1 inline_test.cc -o ss
分析:
没有符号fun2,说明fun2展开了,fun1没有展开, 还是会压栈和出栈。
这也就是为什么要求inline函数要求相对简单, 没有switch等控制和循环语句的原因。
那如果把fun1和fun2的inline关键字都去掉会如何?
结论: 对于一个函数,是否真的inline,是由编译器和programer共同决定的。有没有inline,就要看目标文件是否中是否对函数展开。编译器版本、代码的实现都是决定因素。
2. 类内的inline成员函数
#include<iostream>
using namespace std;
int i = 0;
class InlineTest
{
public:
inline void fun1()
{
if (i<100)
{
i++;
fun1();
}
}
inline int fun2(int n)
{
return n;
}
};
int main()
{
InlineTest t;
t.fun1();
t.fun2(1);
return 0;
}
#include<iostream>
using namespace std;
int i = 0;
class InlineTest
{
public:
void fun1()
{
if (i<100)
{
i++;
fun1();
}
}
int fun2(int n)
{
return n;
}
};
int main()
{
InlineTest t;
t.fun1();
t.fun2(1);
return 0;
}
结论: 对于类内的inline成员函数,编译器自动优化。