निम्नलिखित कोड पर विचार करें:
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 ++ दोनों चर को आसानी से बना सके जितनी आसानी से यह सरणी बना सकता है?