Constexpr peut être génial et utile pour l'optimisation de la compilation. Par exemple...
strlen(char*)
Peut être précompilé en utilisant....
constexpr inline size_t strlen_constexpr(char* baseChar) {
return (
( baseChar[0] == 0 )
?(// if {
0
)// }
:(// else {
strlen_constexpr( baseChar+1 ) + 1
)// }
);
}
Ce qui lui donne un coût d'exécution de "0" lorsqu'il est optimisé... Mais il est plus de 10 fois plus lent à l'exécution.
// Test results ran on a 2010 macbook air
--------- strlen ---------
Time took for 100,000 runs:1054us.
Avg Time took for 1 run: 0.01054us.
--------- strlen_constexpr ---------
Time took for 100,000 runs:19098us.
Avg Time took for 1 run: 0.19098us.
Existe-t-il des macros / modèles existants pour lesquels une seule fonction unifiée peut être utilisée à la place, par exemple.
constexpr size_t strlen_smart(char* baseChar) {
#if constexpr
... constexpr function
#else its runtime
... runtime function
}
Ou un hack de surcharge qui permettrait ce qui suit
constexpr size_t strlen_smart(char* baseChar) {
... constexpr function
}
inline size_t strlen_smart(char* baseChar) {
... runtime function
}
Nota: Cette question s'applique au concept en général. Il s'agit d'avoir deux fonctions distinctes pour runtime et constexpr au lieu des fonctions données en exemple.
Avis de non-responsabilité : Le réglage du compilateur sur -O3 (niveau d'optimisation) est plus que suffisant pour corriger 99,9 % des optimisations des chars statiques, ce qui rend tous les exemples ci-dessus "inutiles". Mais cela n'a rien à voir avec cette question, car elle s'applique à d'autres "exemples", et pas seulement à l'exemple suivant strlen
.