Ma première réaction était « mais pourquoi met-il les résultats en cache alors que le compilateur va tout calculer à la compilation ? ». prime_sieve::operator()(uint64_t) est constexpr, du coup le compilateur peut l'exécuter pour les paramètres connus à la compilation. Autrement dit, ça fonctionne très bien sans memoized :
intmain(intargc,char**argv){prime_sieveps;// les appels à ps(...) sont remplacés par le résultat dès la compilation.std::cout<<ps(7)<<" "<<ps(100)<<"\n";return0;}
En fait là où c'est très intéressant c'est quand les paramètres ne sont pas connus à la compilation. Dans ce cas memoized::operator() sera effectivement appelée au runtime et l'appel pourra profiter des valeurs qui auront été mises en cache à la compilation.
PS : je pense qu'il y a une typo dans la condition d'arrêt de ta boucle, i < v devrait être i < n, non ?
# C'est mieux si les paramètres sont inconnus lors de la compilation
Posté par Julien Jorge (site web personnel) . En réponse au journal Mémorisation partielle de fonction constexpr. Évalué à 8.
Ma première réaction était « mais pourquoi met-il les résultats en cache alors que le compilateur va tout calculer à la compilation ? ».
prime_sieve::operator()(uint64_t)estconstexpr, du coup le compilateur peut l'exécuter pour les paramètres connus à la compilation. Autrement dit, ça fonctionne très bien sansmemoized:En fait là où c'est très intéressant c'est quand les paramètres ne sont pas connus à la compilation. Dans ce cas
memoized::operator()sera effectivement appelée au runtime et l'appel pourra profiter des valeurs qui auront été mises en cache à la compilation.PS : je pense qu'il y a une typo dans la condition d'arrêt de ta boucle,
i < vdevrait êtrei < n, non ?