c++ optimization constexpr c++20

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.