C++ 20 constexpr std:: optimizaciones de copia para tiempo de ejecución
optimization c++20 (1)
cppreference.com dice:
En la práctica, las implementaciones de std :: copy evitan múltiples asignaciones y usan funciones de copia masiva como std :: memmove si el tipo de valor es TriviallyCopyable
Sin embargo, la página también indica que las sobrecargas que no toman una política de ejecución serán
constexpr
desde C ++ 20.
¿El estándar prohibirá estas optimizaciones de tiempo de ejecución (ya que
std::memmove
no es constexpr) o hay una manera de optimizar
constexpr
funciones
constexpr
para el tiempo de ejecución?
Podemos tener nuestro pastel y comerlo también.
Consideremos la especialización más simple de
copy
, la que copia caracteres.
En C ++ 17, eso podría verse así:
char* copy(char const* first, char const* last, char* d)
{
memcpy(d, first, last - first);
return d + (last - first);
}
Por supuesto, no podemos
constexpr
a
constexpr
porque eso
memcpy
no es una función constexpr, eso no funcionará.
Pero solo no funciona durante la evaluación constante.
Lo que necesitamos es una forma de usar condicionalmente
memcpy
si estamos en tiempo de ejecución.
Tenemos algo así en 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);
}
}
Y ahora tenemos un algoritmo que hace lo eficiente en tiempo de ejecución pero que aún funciona durante el tiempo de evaluación constexpr.
Nota: es
if (std::is_constant_evaluated())
,
nunca
if constexpr (std::is_constant_evaluated())
.
El último es equivalente a
if constexpr (true) { ... }
.
gcc 10.1 comenzará a advertir sobre este uso erróneo.