[英]constexpr std::vector and constexpr std::string in C++20
[英]C++20 constexpr std::copy optimizations for run-time
实际上,如果值类型为TriviallyCopyable,则std :: copy的实现会避免多个赋值并使用批量复制函数,例如std :: memmove
但是,该页面还指出,自C ++ 20以来,不执行执行策略的重载将是constexpr
。 标准是否会禁止这些运行时优化(因为std::memmove
不是constexpr)或有没有办法优化constexpr
函数的运行时?
我们也可以吃蛋糕,也可以吃。
我们只考虑copy
的最简单的专业化,即复制char
的。 在C ++ 17中,这可能看起来像:
char* copy(char const* first, char const* last, char* d)
{
memcpy(d, first, last - first);
return d + (last - first);
}
当然,我们不能只拍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);
}
}
现在我们有一个算法可以在运行时执行高效的操作,但在constexpr评估时仍然有效。
注:这是if (std::is_constant_evaluated())
从来没有 if constexpr (std::is_constant_evaluated())
后者等同于if constexpr (true) { ... }
。 gcc 10.1将在此错误用法时开始警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.