C++ 11 内敛函数inline

inline 是什么?

inline是C++ 11引入的关键字,在函数声明or定义时,返回类型前加上关键字inline,即可以把函数指定为内联函数。

引入inline的目的是什么?

目的是解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。另一方面用于替换C语言的宏(相比较宏是无法在进行类型检查)

内敛函数的特点
  • 内联函数的函数内容本质上是写在调用内联函数的地方;
  • 内敛函数本质上没有入栈出栈的开销;
  • 和宏定义相比,内敛函数更加安全,编译器会根据函数的要求进行严格的类型和作用域检查,保证调用无误;
  • 内联函数一般上不包含循环、递归、switch或较长的代码 等复杂操作;
  • 类声明中定义的函数,除虚函数外的其他函数都会自动隐式地当成内联函数;
内敛函数的写法

这里的一个关键点,inline必须与函数定义放在一起才能使函数成为内联函数,仅将inline放在函数声明前面不起任何作用。

inline是一种“用于实现”的关键字,不是一种“用于声明”的关键字。

//在头文件中可以进行显示声明

//方式1 加 inline(建议使用)
inline int TestFunc(int a, int b);

//方式2 原始常见声明方式
int TestFunc(int a, int b);

//在源文件中定义
//正确
inline int TestFunc(int a, int b){
    //do something
    return 0;
}
//错误
int TestFunc(int a, int b){
    //do something
    return 0;
}
隐式内联和显式内联
  • 隐式内联的写法
class CppObj {
    int TestFuncA() { return 0; }       //隐式内敛
    vitrual int TestFuncB() { return 0; }    //虚函数不会进行隐式内敛   
}
  • 显式内联的写法
class CppObj {
    int TestFuncA();
    inline int TestFuncB();
    vitrual int TestFuncC();
}
inline int CppObj::TestFuncA() {   //显式内联
    return 0; 
} 

inline int CppObj::TestFuncB() {   //显式内联
    return 0; 
} 

inline 函数的编译器处理

inline函数仅仅是一个开发者对编译器的建议,至于最后能否真正内联,需要看编译器的意思。如果编译器判定函数不复杂,能在调用点展开,就会真正内联。

内联函数优缺点

  • 优点
  1. 内联函数相比宏函数来说,在代码调用时会做安全检查和类型转换(同普通函数),而宏定义则不会;
  2. 宏定义不可以在运行时可调试,但内联函数可以;
  3. 内联函数同宏函数一样会在被调用处进行展开,无需参数压栈、栈帧开辟与回收,结果返回等,从而能提高代码的运行速度。
  • 缺点
  1. 代码膨胀。内联是以代码膨胀(复制)为代价,是典型的以空间换时间的做法。
  2. 内联函数不可控。内联函数只是编码者对编译器的建议,是否对函数内联,最终决定权在于编译器。
  3. inline 函数无法随着函数库升级而升级。inline函数的改变需要重新编译,不像 non-inline 可以直接链接。

虚函数可以是内联函数吗?

  • 虚函数可以是内联函数;
  • inline是可以修饰虚函数;
虚函数内敛条件?
  • 可以内敛的条件,编译器具有实际对象而不是对象的指针或引用时才会,所以当虚函数表现多态性的时候不能内联。
虚函数表现多态性的时候不能内联

内联是在编译期进行的,但虚函数的多态性在运行期,所以编译器无法知晓运行期具体调用哪个代码

代码释义
#include <iostream>
using namespace std;
class Base {
public:
	virtual ~Base() {}
	inline virtual void FuncName() { cout << "this is Base " << endl; }
};

class Derived : public Base {
public:
	inline virtual void FuncName() { cout << "this is Derived" << endl; }
};

int main()
{
	// 编译器具有实际对象,所以它可以是内联的.
	Base b;
	b.FuncName();

	// 编译器具有对象的指针,呈现多态性,运行时期才能确定,所以不能内联。
	Base* p = new Derived();
	p->FuncName();

	delete p;
	p = nullptr;

	system("pause");
	return 0;
}

参考连接:

Are “inline virtual” member functions ever actually “inlined”?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在C++中,内联函数inline)是一种特殊的函数,它的定义处增加了inline关键字。内联函数的作用是在函数调用函数的代码直接插入到调用处,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高程序的执行效率。\[1\] 内联函数定义方式与普通函数相似,但在函数定义处增加了inline关键字。例如,我们可以使用内联函数来实现交换两个数的值: ```cpp inline void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } ``` 在使用内联函数,编译器会将函数的代码直接插入到函数调用处,而不是通过函数调用的方式执行。这样可以避免函数调用的开销,提高程序的执行效率。\[1\] 需要注意的是,内联函数适用于函数体较小且频繁调用的情况。对于函数体较大或者不频繁调用的函数,使用内联函数可能会导致代码膨胀,降低程序的执行效率。因此,需要根据实际情况来决定是否使用内联函数。\[3\] #### 引用[.reference_title] - *1* [【C++】内联函数inline](https://blog.csdn.net/Jacky_Feng/article/details/120748428)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[C++] 内联函数inline 以及 auto关键字 -- C++入门(4)](https://blog.csdn.net/qq_58325487/article/details/124735528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值