C++函数详解(三)—— inline与constexpr函数、匹配和函数指针

本文详细介绍了C++中的内联函数和constexpr函数,讨论了它们的作用、使用场景以及如何放置在头文件中。此外,还探讨了函数匹配原则和函数指针的使用,包括定义、调用、作为形参和返回值的情况。
摘要由CSDN通过智能技术生成

1 inline 与 constexpr 函数

1.1 内联函数

在函数签名的返回值类型前加上关键字inline,指示编译器将此函数作为内联函数,即在每个调用它的地方将其“内联地”展开(可以理解为在调用它的地方将调用函数代码替换为函数内部的实现代码)。常常将需要频繁调用且规模较小的轻量函数定义为内联函数,其意义如下:

  • 对于实现轻量操作的小函数而言,将其内部的轻量操作封装为一个小函数,而不是在需要执行这些轻量操作的地方直接写操作本身的代码,有利于程序的封装和复用。
  • 但如果这种封装的小函数只是普通的函数,而程序中需要对其频繁调用。因为函数调用隐式地包含了很多耗费资源的额外工作(如传参初始化形参临时对象等),因此在频繁调用的情景下会造成不必要的资源浪费。
  • 定义为内联函数,既满足了封装性,又避免了实际调用时带来的资源损耗。

需要注意两点:

  • 在函数签名中声明inline只是向编译器发出内联展开的请求,编译器可以根据情况忽略这个请求。一般不支持内联递归函数,且一个75行以上的函数也不大可能在调用点内联展开。
  • 除了显式地声明 inline外,还存在隐式内联函数。当类的一个成员函数在类内声明处定义时,编译器就会将其自动地优化为内联函数,这就是典型的隐式内联

范例:

//内联版本的shorterStr函数(返回两个string对象中较短的那个)
inline const string & shorterStr(const string &s1, const string &s2) {
   
	return s1.size() <= s2.size() ? s1 : s2;
}

int main() {
   
	string s1 = "aaaa", s2 = "bb";
	cout << shorterStr(s1, s2) << endl; //由于shorter是内联函数,在编译过程中,此语句被编译器展开为以下的形式:
	cout << s1.size() <= s2.size() ? s1 : s2; << endl;
}

class Array {
   
public:
	void func() {
    //在类内声明处定义,此函数隐式内联
		cout << "Array func" << endl;
	}
	void func1(); //func1在类内声明,类外定义
	inline void func2(); //func2在类内显式声明为内联函数,类外定义
	void func3(); //func3在类内没有显式声明为inline,在类外定义时追加inline
};
void Array::func1() {
    //func1在类内声明,类外定义,不会隐式自动优化为内联函数
	cout << "Array func1" << endl;
}
void Array::func2() {
    //func2在类内显式声明为内联函数,类外定义,编译器会在调用func2时尝试将其内联展开
	cout << "Array func2" << endl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值