0
点赞
收藏
分享

微信扫一扫

《C++primer》第五版笔记:内联函数和constexpr函数

思考的鸿毛 2022-01-30 阅读 48

具体参考原书P213

目录

1.内联函数

内联函数可避免函数调用的开销

2.constexpr函数

定义

constexpr不一定返回常量表达式

把内联函数和constexpr函数放在头文件内


1.内联函数

内联函数可避免函数调用的开销

将函数指定为内联函数(inline),通常就是将它在每个调用点内联地展开。假设我们把shorterString函数定义为内联函数,则如下调用:

cout<<shorterString(s1,s2)<<endl;

在编译过程中展开成类似于下面的形式:

cout<<(s1.size()<s2.size?s1:s2)<<endl;

从而消除了shorterString函数的运行时开销。

2.constexpr函数

先回顾一下字面值类型:到目前接触过的数据类型中,算术类型,引用和指针都属于字面值类型。因为这些类型一般比较简单,值也显而易见。(原书P59)

定义

constexpr函数是指能用于常量表达式的函数,定义constexpr函数的方法和其他函数类似,不过要遵循几项约定:函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句:

栗子:

constexpr int new_sz(){return 42;};
constexpr int foo=nre_sz();

执行初始化任务时,编译器把constexpr函数的调用替换成其结果值。为了能在编译过程中随时展开,constexpr被隐性指定为内联函数。

constexpr不一定返回常量表达式

constexpr size_t scale(size_t cnt) { return new_size()*cnt; }
//当scale的参数是常量表达式时,它的返回值也是一个常量表达式,反之则不然
int arr[scale(2)];//正确,scale(2)是常量表达式
int i=2;
int arr[scale(i)];//错误,scale(i)不是常量表达式

把内联函数和constexpr函数放在头文件内

和其他函数不一样,内联函数和constexpr函数可以在程序中多次定义。毕竟,编译器要想展开函数仅有函数声明是不够的,还需要有函数的定义。不过,这对于某个给定的内联函数或者constexpr函数来说,它的多个定义必须完全一致。基于这个原因,内联函数和constexpr函数通常定义在头文件中。

举报

相关推荐

0 条评论