gpt4 book ai didi

c++ - Visual C++ constexpr提示

转载 作者:行者123 更新时间:2023-12-01 15:10:28 24 4
gpt4 key购买 nike

除非绝对必要,否则Visual C++因忽略constexpr函数限定符而臭名昭著。看下面的函数:

constexpr int multiply(int l, int r) noexcept
{
return l * r;
}
根据该标准,完全允许Visual C++在编译时不评估右值:
auto three_times_four = multiply(3, 4);
我一直在使用的解决方法是这种难看的力量:
constexpr auto constexpr_three_times_four = ;
auto not_constexpr_three_times_four = constexpr_three_times_four;
// use not_constexpr_three_times_four in non-constexpr contexts

// alternatively:
template<auto val>
inline constexpr auto ensure_constexpr = val;
auto not_constexpr_three_times_four = ensure_constexpr<multiply(3, 4)>;
有没有一种方法可以向编译器提示这些东西应该在编译时进行评估?
我对以下内容特别恼火:
namespace l
{
constexpr ::std::uint32_t operator""_crc32(const char * p, ::std::size_t const size) noexcept
{
return crc32(p);
}
}
//...
using namespace l;
search("foo"_crc32);//You don't want to evaluate this at runtime? too bad.
因此,在这种情况下,我该怎么做以提示编译器并避免这些难看的修复程序?

最佳答案

没有机制可以向编译器(任何编译器)“提示”在编译时“应”调用constexpr函数。那不是constexpr的目的。它不是用于加速代码执行的工具。它是一个工具,允许您执行必须在编译时执行的计算。
C++ 20允许将函数指定为consteval,以确保必须在常量表达式内执行该函数。但是,即使该功能也不是为了性能。它在那里,以便他们可以添加语言的新功能(例如反射值),这些功能只能在编译时存在,而不会泄漏到运行时代码中。
C++ 20的constinit允许您声明非常量表达式变量,其初始化程序必须是常量表达式。这是最接近constexpr -as-a-performance-feature的C++。
但是否则,如果编译器的较高优化级别未在编译时调用这些函数,则这就是编译器选择实现该功能的方式。

关于c++ - Visual C++ constexpr提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62881727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com