Considérez le code suivant:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
Lors de l'analyse comparative de sa compilation par g ++ par la commande Bash suivante (avec g ++ 8.3.0)
for ((level=1; level<30; ++level)); do
echo -n ${level},
/usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null
done
J'obtiens la sortie suivante:
1,0.03
2,0.03
3,0.04
4,0.04
5,0.04
6,0.04
7,0.04
8,0.04
9,0.03
10,0.04
11,0.02
12,0.04
13,0.02
14,0.03
15,0.04
16,0.05
17,0.05
18,0.08
19,0.11
20,0.20
21,0.35
22,0.67
23,1.30
24,2.52
25,5.02
26,10.23
27,19.96
28,40.30
29,80.99
Ainsi, le temps de compilation est exponentiel LEVEL
. Mais si je passe B x, y;
à B x[2];
, la compilation se fait en temps constant (~ 30 ms).
Pourquoi cela arrive-t-il? Je pensais que, puisque le compilateur sait que B
c'est un seul et même type pour les deux x
et y
, cela prendrait le même temps que la compilation x[2]
. Mais pour une raison quelconque, cela semble différent. Puis-je en quelque sorte forcer B
à être réalisé (par opposition à simplement aliasé) afin que g ++ puisse créer les deux variables aussi facilement qu'il a créé le tableau?
c++
templates
gcc
compilation
Ruslan
la source
la source
Réponses:
Parce qu'il y a un bogue dans votre instance g ++. Cela ne devrait pas, et comme l'a commenté @Marc Glisse, vous devez le signaler (ce que vous avez fait au moment de la rédaction)
Vous voudrez peut-être alors supprimer votre question (choix plus sage). Ou acceptez cette réponse.
la source