亲宝软件园·资讯

展开

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

BUG_C++ 人气:0

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

总结 

加载全部内容

相关教程
猜你喜欢
用户评论