27.内联函数

内联函数是空间换时间

在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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值