【发布时间】:2021-10-03 22:07:25
【问题描述】:
不知道在函数中用constexpr定义变量是否有意义。
void func() { static const int i = 1; }
void func2() { constexpr const int i = 1; }
函数中的static const会在第一次函数调用时被初始化,那么函数中的constexpr呢?我知道constexpr 指定该对象应该在编译期间可用。那么这是否意味着func2 中的变量i 将在编译时进行评估,而func 中的i 则不会?
【问题讨论】:
-
对于在构造和销毁时没有副作用的类型(不执行 IO 或类似操作),由于编译器可以执行的优化,生成的二进制文件的结果可能会变得相同。从语言的角度来看,它们表达了两种不同的东西。
-
Does static constexpr variable inside a function make sense? 会回答您的问题吗? "注意
static和constexpr是完全相互独立的。static定义了对象在执行期间的生命周期;constexpr指定了对象在编译期间应该是可用的。编译和执行是不相交和不连续的,在时间和空间上都是如此。所以一旦程序编译完成,constexpr就不再相关了。" -
"
static constin a function will be initialized on the first function call" — 请注意,这基本上仅适用于非平凡类型。对于琐碎的,它们的二进制表示在程序中是硬编码的。现场演示:godbolt.org/z/hxPTGoanK(在机器码级别g中没有i的初始化)。 -
其实我很在意评估的时间。我刚刚重新编辑了我的问题。
-
在大多数情况下,
constexpr是首选解决方案。它是一个编译时间常数。附加信息:不需要constexpr之后的const。而且,阅读你的问题,如果你可以在函数体中定义一个constexpr,那就去做吧,因为它会缩小范围。
标签: c++ c++11 static constants constexpr