C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++11内联函数inline

C++11中内联函数(inline)用法实例

作者:BUG_C++

内联函数本质还是一个函数,但在声明的时候,函数体要和声明结合在一起,否则编译器将它作为普通函数来对待,下面这篇文章主要给大家介绍了关于C++11中内联函数(inline)的相关资料,需要的朋友可以参考下

inline 是什么?

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

引入inline的目的是什么?

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

内联函数的特点

内联函数的写法

这里的一个关键点,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函数仅仅是一个开发者对编译器的建议,至于最后能否真正内联,需要看编译器的意思。如果编译器判定函数不复杂,能在调用点展开,就会真正内联。

内联函数优缺点

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

虚函数内联条件?

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

虚函数表现多态性的时候不能内联

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

代码释义

#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”?

总结 

到此这篇关于C++11中内联函数(inline)用法的文章就介绍到这了,更多相关C++11内联函数inline内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文