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)在每个翻译单元中都拥有相同的地址。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)