我如何确认我的 constexpr 表达式实际上已经在编译时执行
How can I confirm that my constexpr expression has been actually performed in compile-time
由于 constexpr
不保证它会被处理 'in-compile-time',我想知道一些方法来检查我的代码是否真的在编译时执行过.
让我们假设我已经创建了一些仿函数 class,在执行时 returns 一个值数组。我希望它在编译时进行。
#include "Functor.hpp"
constexpr Functor<int> functor_g; // not sure if should be static too
auto globalArray = functor_g(); // not sure if should be also const/constexpr
int main()
{
// ...
}
显然我不能在此处 运行 任何计时器,因为它们需要 运行 时间环境。
编辑:
我已经通过检查 godbolt.org 下的汇编结果确认它在编译时执行。这是一个小事情的方法,但我仍然会感谢其他一些方法。
How can I confirm that my constexpr expression has been actually performed in compile-time
您必须检查生成的程序集。
但是你只能检查特定平台的特定编译器的特定可执行文件。您不能保证,对于不同的编译器,您也可以从相同的代码中获得编译时执行。
从语言的角度来看,你可以强加编译时执行,但永远不要忘记 "Allows any and all code transformations that do not change the observable behavior of the program".
的 "as-if rule"
要强制执行编译时执行(忽略 "as-if rule"),您必须使用从 constexpr
函数返回的值,其中需要编译时的值。
一些例子(假设constexpr foo()
函数returns一个std::size_t
):
1) 初始化一个constexpr
变量
constexpr std::size_t bar = foo();
2) C 风格数组大小
char bar[foo()];
3) 在模板参数中
std::array<char, foo()> bar;
4) 在 static_assert()
测试中
static_assert( foo() == 3u, "isn't three");
由于 constexpr
不保证它会被处理 'in-compile-time',我想知道一些方法来检查我的代码是否真的在编译时执行过.
让我们假设我已经创建了一些仿函数 class,在执行时 returns 一个值数组。我希望它在编译时进行。
#include "Functor.hpp"
constexpr Functor<int> functor_g; // not sure if should be static too
auto globalArray = functor_g(); // not sure if should be also const/constexpr
int main()
{
// ...
}
显然我不能在此处 运行 任何计时器,因为它们需要 运行 时间环境。
编辑: 我已经通过检查 godbolt.org 下的汇编结果确认它在编译时执行。这是一个小事情的方法,但我仍然会感谢其他一些方法。
How can I confirm that my constexpr expression has been actually performed in compile-time
您必须检查生成的程序集。
但是你只能检查特定平台的特定编译器的特定可执行文件。您不能保证,对于不同的编译器,您也可以从相同的代码中获得编译时执行。
从语言的角度来看,你可以强加编译时执行,但永远不要忘记 "Allows any and all code transformations that do not change the observable behavior of the program".
的 "as-if rule"要强制执行编译时执行(忽略 "as-if rule"),您必须使用从 constexpr
函数返回的值,其中需要编译时的值。
一些例子(假设constexpr foo()
函数returns一个std::size_t
):
1) 初始化一个constexpr
变量
constexpr std::size_t bar = foo();
2) C 风格数组大小
char bar[foo()];
3) 在模板参数中
std::array<char, foo()> bar;
4) 在 static_assert()
测试中
static_assert( foo() == 3u, "isn't three");