Hãy xem xét các mã sau đây:
template<int i> class A
{
typedef A<i-1> B;
B x, y;
};
template<> class A<0> { char m; };
int main()
{
A<LEVEL> a;
}
Khi điểm chuẩn biên dịch của nó bằng g ++ bằng lệnh Bash sau (với 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
Tôi nhận được đầu ra sau đây:
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
Vì vậy, thời gian biên dịch là theo cấp số nhân LEVEL. Nhưng nếu tôi thay đổi B x, y;thành B x[2];, thì quá trình biên dịch diễn ra trong thời gian không đổi (~ 30 ms).
Tại sao nó xảy ra? Tôi nghĩ rằng, vì trình biên dịch biết rằng đó Blà một và cùng loại cho cả hai xvà y, nó sẽ mất cùng thời gian với việc biên dịch x[2]. Nhưng vì một số lý do, nó xuất hiện khác nhau. Tôi bằng cách nào đó có thể buộc Bphải được nhận ra (trái ngược với bí danh đơn giản) để g ++ có thể tạo cả hai biến dễ dàng như khi tạo mảng không?