Jak*_*ský 28 c++ optimization constexpr c++20
实际上,如果值类型为TriviallyCopyable,则std :: copy的实现应避免多次分配,并使用大容量复制功能,例如std :: memmove
但是,该页面还指出,不采用执行策略的重载将constexpr
自C ++ 20开始。该标准是否会禁止这些运行时优化(因为std::memmove
不是constexpr),或者是否有一种方法可以优化constexpr
运行时的功能?
Bar*_*rry 34
我们也可以吃蛋糕也可以吃。
让我们考虑copy
复制char
s 的最简单的专业化。在C ++ 17中,可能看起来像:
char* copy(char const* first, char const* last, char* d)
{
memcpy(d, first, last - first);
return d + (last - first);
}
Run Code Online (Sandbox Code Playgroud)
当然,我们不能仅仅constexpr
因为memcpy
不是constexpr函数就对它打耳光。但这仅在持续评估期间不起作用。我们需要的是一种memcpy
在运行时有条件使用的方式。
我们在C ++ 20中有这样的事情std::is_constant_evaluated()
:
constexpr char* copy(char const* first, char const* last, char* d)
{
if (std::is_constant_evaluated()) {
while (first != last) {
*d++ = *first++;
}
return d;
} else {
memcpy(d, first, last - first);
return d + (last - first);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我们有了一种算法,该算法可以在运行时执行高效的操作,但仍然可以在constexpr评估期间使用。
注意:是if (std::is_constant_evaluated())
,从来没有 if constexpr (std::is_constant_evaluated())
。后者等效于if constexpr (true) { ... }
。gcc 10.1将对此错误用法发出警告。