C++ 11中的constexpr 到底怎么用? 只知道const 不懂constexpr

C++ 11中的constexpr 到底怎么用? 只知道const 不懂constexpr,第1张

constexpr 用于定州搏义编译时可计算的常量表达式。

1、编译时常量函数,拆迹罩编译器可以可以计算旅闹该函数的值。比如一些宏(macro)函数,就可以用 constexpr 函数来更好的代替。

2、编译时常量数据,比如某些在类和类模板中定义的静态常量数据,以前是用 static const 定义,现在可以改用 constexpr 定义了,可以获得更好的效率和安全性。

因为staff_size是个局部栈变量,它的地址要在运行没举厅时才能得到答穗,而constexpr auto* p1要求对p1赋值的地址是个能在编译期就能确定的常量,所以出错。可以把staff_size定枯隐义为静态变量或者全局变量,这样编译期就可确定其地址了:

int main() {

static const auto staff_size = 27 //static静态的

constexpr auto* p1 = &staff_size

return 0

}

inline说明符(inline specifier)在C++17前用于声明一个函数为内联函数, C++17起可用于声明内联变量。“inline”为C++语言的一个关键字。

inline说明符在用于函数的“声明说明符序列”时,将函数声明为一个内联函数。

(1)内联函数的作用

(2)注意事项

内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码, 将使和郑程序的总代码量增大,消耗更多的内存空间。

不宜使用内联函数的情况:函数体内代码过长或者有循环语句。这样的情况下,使用内联函数往往开销更大。

(3)隐式内联函数的情况

(4)细节知识

从C++17起,关键字 inline 对于函数的定义已经变为“允许多次定义”而非“优先内联”,因此该含义扩展到了变量。

inline说明符,在用于具有静态存储虚乱期的变量(静态类成员或命名空间作用域变量)的“声明说明符序列”时,将变量声明为内联变量。声明为constexpr的静态成员变量(非命名空间作用域变量)是隐式的内联变量。

inline变量的主要作用是 即使定义的全局对象被多个文件引用也只会有一个全局对象,即内联变量是唯一的。inline变量将隐式声明为唤誉颂extern(外部链接)。

内联变量消除了将C++代码打包为唯头文件的库的主要障碍。

inline变量和thread_local组合可以为每一个线程定义一个属于线程自己的内联变量(thread_local是C++11增加的关键字)。如:

inline变量为C++17核心语言功能特性,于提案 P0386R2 (见文档:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0386r2.pdf) 中提出。各编译器支持情况见下表:

从C++17标准起,可通过判断宏 __cpp_inline_variables 是否被定义来判断编译器是否支持内联变量,比如:

内联函数或内联变量具有以下性质:

(1)在程序中可有多次定义,只要每个定义都出现在不同的翻译单元中(对于非静态的内联函数和变量)且所有定义等同即可。例如,内联函数或内联变量可定义于被多个源文件所#include的头文件中。

(2)必须在每个翻译单元中都被声明为inline。

(3)在每个翻译单元中都拥有相同的地址。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12214364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存