다음 코드를 고려하십시오.
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];
컴파일은 일정한 시간 (~ 30ms)에 발생합니다.
왜 그런가요? 나는 컴파일러가 알고 있기 때문에, 그 생각 B
하나 모두 동일 유형 x
과 y
는 컴파일과 동일한 시간이 걸릴 것이다 x[2]
. 그러나 어떤 이유로 든 다르게 보입니다. B
g ++이 배열을 만드는 것처럼 쉽게 두 변수를 만들 수 있도록 어떻게 든 간단하게 앨리어싱과 달리 실현시킬 수 있습니까?
답변
g ++ 인스턴스에 버그가 있기 때문입니다. @Marc Glisse가 언급 한대로보고하지 말아야합니다 (작성 당시 작성한 내용).
질문을 삭제하고 싶을 수도 있습니다 (더 현명한 선택). 아니면이 대답을 받아들이십시오.