Betrachten Sie den folgenden Code:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
Beim Benchmarking der Kompilierung durch g ++ mit dem folgenden Bash-Befehl (mit 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
Ich erhalte folgende Ausgabe:
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
Die Kompilierungszeit ist also in exponentiell LEVEL
. Wenn ich jedoch zu wechsle B x, y;
, B x[2];
erfolgt die Kompilierung in konstanter Zeit (~ 30 ms).
Warum passiert das? Ich dachte, da der Compiler weiß, dass dies B
für beide ein und derselbe Typ ist x
und y
es genauso lange dauern würde wie das Kompilieren x[2]
. Aber aus irgendeinem Grund sieht es anders aus. Kann ich irgendwie B
die Realisierung erzwingen (im Gegensatz zu einfachem Aliasing), damit g ++ beide Variablen genauso einfach erstellen kann wie das Array?
c++
templates
gcc
compilation
Ruslan
quelle
quelle
Antworten:
Weil es einen Fehler in Ihrer g ++ - Instanz gibt. Dies sollte nicht der Fall sein, und wie @Marc Glisse kommentierte, sollten Sie dies melden (was Sie zum Zeitpunkt des Schreibens getan haben).
Vielleicht möchten Sie Ihre Frage dann löschen (klügere Wahl). Oder akzeptiere diese Antwort.
quelle