• # C'est mieux si les paramètres sont inconnus lors de la compilation

    Posté par (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) 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 :

    int main(int argc, char** argv) {
     prime_sieve ps;
     // les appels à ps(...) sont remplacés par le résultat dès la compilation.
     std::cout << ps(7) << " " << ps(100) << "\n";
     return 0;
    }

    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 ?