নিম্নলিখিত কোড বিবেচনা করুন:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
নিম্নলিখিত বাশ কমান্ড দ্বারা 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 এমএস) হয় happens
কেন এমন হয়? আমি ভেবেছিলাম, যেহেতু সংকলক জানে যে এটি উভয়র B
জন্য এক এবং একই ধরণের x
এবং y
এটি সংকলনের মতো একই সময় নেয় x[2]
। তবে কিছু কারণে এটি ভিন্ন প্রদর্শিত হয়। আমি কীভাবে কোনওভাবে B
অনুধাবন করতে বাধ্য করতে পারি (কেবলমাত্র এলিয়াসের বিপরীতে) যাতে জি ++ উভয় ভেরিয়েবলকে সহজেই তৈরি করতে পারে যেমন এটি অ্যারে তৈরি করেছিল?