j'ai modifié ton code en changeant 24 en 800 et aussi en répétant la définition du tableau 100 fois (dans des scopes séparés).
Pour 100 compilations, la version constexpr prend 17.2s contre seulement 2.8s pour les template.
En doublant le nombre de définition des tableaux, le temps de compilation avec constexpr double quasiment (33.3s) alors que template ne change quasiment pas (3.0s).
Mon explication est que, dans la version template, la quasi totalité du temps se passe lors de la 1ere instanciation (donc les 800 classes count_t, count_t, ...). Pour les 99 tableaux restants, le coût est minimal car le compilateur possède déjà la classe count_t dans sa table des symboles.
Au contraire la version constexpr doit réévaluer count(800) à chaque apparition.
#define P 800#if 1constexprintcount(unsignedn){return(n==0)?0:1+count(n-1);}#define N count(P)#elsetemplate<unsignedN>structcount_t;// le cas d'arrêttemplate<>structcount_t<0>{enum{value=0};};// le calcul récursif pour le cas général.template<unsignedN>structcount_t{enum{value=1+count_t<N-1>::value};};#define N count_t<P>::value #endifvoidfoo(){// Pouf ! Ça marche.{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}{intarray[N];}}
# Pas si simple.
Posté par SChauveau . En réponse au journal Constexpr versus template. Évalué à 10.
j'ai modifié ton code en changeant 24 en 800 et aussi en répétant la définition du tableau 100 fois (dans des scopes séparés).
Pour 100 compilations, la version constexpr prend 17.2s contre seulement 2.8s pour les template.
En doublant le nombre de définition des tableaux, le temps de compilation avec constexpr double quasiment (33.3s) alors que template ne change quasiment pas (3.0s).
Mon explication est que, dans la version template, la quasi totalité du temps se passe lors de la 1ere instanciation (donc les 800 classes count_t, count_t, ...). Pour les 99 tableaux restants, le coût est minimal car le compilateur possède déjà la classe count_t dans sa table des symboles.
Au contraire la version constexpr doit réévaluer count(800) à chaque apparition.