निम्नलिखित कोड पर विचार करें:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
जब निम्नलिखित Bash कमांड द्वारा g ++ द्वारा इसके संकलन को बेंचमार्क किया जा रहा है (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
मुझे निम्न आउटपुट मिले:
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
तो, संकलन समय में घातीय है LEVEL। लेकिन अगर मैं बदल B x, y;जाता हूं B x[2];, तो निरंतर समय (~ 30 एमएस) में संकलन होता है।
क्यों होता है? मैंने सोचा कि, चूंकि कंपाइलर जानता है कि Bदोनों के लिए एक ही प्रकार है xऔर y, संकलन के रूप में एक ही समय लगेगा x[2]। लेकिन किसी कारण से यह अलग दिखाई देता है। क्या मैं किसी तरह Bमहसूस किया जा सकता हूं (जैसा कि केवल अलियास के विपरीत) ताकि g ++ दोनों चर को आसानी से बना सके जितनी आसानी से यह सरणी बना सकता है?