【发布时间】:2020-10-01 09:08:22
【问题描述】:
我有什么保证,可能包含 constexpr 函数调用的 核心常量表达式(如 [expr.const].2 中)实际上将在编译时进行评估,这取决于哪些条件?
-
constexpr的引入隐含地承诺通过将计算转移到转换阶段(编译时)来提高运行时性能。 - 但是,该标准并未(并且可能无法)强制要求编译器生成什么代码。 (参见 [expr.const] 和 [dcl.constexpr])。
这两点似乎相互矛盾。
在什么情况下可以依赖编译器在编译时解析核心常量表达式(可能包含任意复杂的计算),而不是将其推迟到运行时?
至少在-O0 下,gcc 似乎实际上发出代码并调用 constexpr 函数。在-O1 及以上没有。
我们是否必须诉诸 trickery 之类的,这会强制 constexpr 通过模板系统:
template <auto V>
struct compile_time_h { static constexpr auto value = V; };
template <auto V>
inline constexpr auto compile_time = compile_time_h<V>::value;
constexpr int f(int x) { return x; }
int main() {
for (int x = 0; x < compile_time<f(42)>; ++x) {}
}
【问题讨论】:
-
@NathanOliver 它解决了同样的问题,但没有直接回答问题。
-
注意 C++20 有
consteval强制执行每个函数,因此在某些情况下,如果您想要保证而不改变使用,它可以提供帮助。 -
@bitmask 好的,你如何区分,仅使用标准,在编译时评估什么时候,什么时候没有?
标签: c++ compilation language-lawyer constexpr c++20