内联函数是空间换时间
在c++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于内联函数会在适当的地方像预定义宏一样展开,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。
为了定义内联函数,通常必须在函数定义前面放一个inline关键字。但是在类内部定义内联函数时并不是必须的。任何在类内部定义的函数自动成为内联函数
但是c++内联编译会有一些限制,以下情况编译器可能考虑不会将函数进行内联编译:
|
内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的函数。
1 内联函数注意事项
// 类内部的成员函数 默认前面会加inline关键字
inline void func(); //内联函数声明
inline void func() { }; //如果函数实现时候,没有加inline关键字 ,那么这个函数依然不算内联函数
内联函数 解决宏缺陷问题
- 给编译器一个建议,加上关键字,编译器不一定按照内联处理
- 不加关键字,也许编译器还偷摸的给你加inline
- 成员函数 默认加上关键字
- 函数声明加了关键字,函数实现也要加inline关键字
// 30内联函数.cpp : 定义控制台应用程序的入口点。
//
#include "iostream"
using namespace std;
//宏定义一个加法
#define MyAdd(x,y) x+y
void test01()
{
int ret = MyAdd(10, 20);
cout << "ret ====" << ret << endl;//ret ====30
int ret2 = MyAdd(10, 20) * 20;//预期600 实际是10+ 20*20
cout << "ret2 ====" << ret2 << endl;//ret2 ====410
}
//宏定义一个比较方法
#define MyCompare(a,b) ((a) < (b)) ? (a) :(b)
void test02()
{
int a = 10;
int b = 20;
int ret = MyCompare(++a, b); // 预期结果 11 ((++a) < (b)) ? (++a):(b)
cout << "ret = " << ret << endl;//ret = 12
}
inline void mycompare(int a, int b)
{
int ret = a < b ? a : b;
cout << "ret ::::: " << ret << endl;//ret ::::: 11
}
void test03()
{
int a = 10;
int b = 20;
mycompare(++a, b);
}
int main()
{
test01();
test02();
test03();
system("pause");
return EXIT_SUCCESS;
}