다음 코드를 고려하십시오.
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 ++이 배열을 만드는 것처럼 쉽게 두 변수를 만들 수 있도록 어떻게 든 간단하게 앨리어싱과 달리 실현시킬 수 있습니까?
1
기술적으로 정확하지만 쓸모없는 답변 : 컴파일러를 패치하십시오.
—
Botje
왜 여기에 게시 하시겠습니까? Gcc에는 문제보고를위한 버그질라가 있습니다 ... 먼저 최신 버전으로 테스트하십시오.
—
Marc Glisse
@ MarcGlisse 좋은 설명이나 해결 방법이 있기를 바랍니다. 내가보고 한 경우 수정하려고하는 버그로 간주되는지 확실하지 않습니다.
—
Ruslan
컴파일러가 컴파일하는 데 너무 오래 걸리는 경우에는 "compile-time-hog"라는 키워드도 있으므로 수정해야 할 가치가 있다고 생각합니다 (즉, 즉시 수행한다는 의미는 아닙니다). 따라서 특히 지수 동작이없는 다른 컴파일러를 볼 수 있다면 (그러므로 피할 수 있음을 알고 있음)보고하십시오. 데이터베이스에 매우 비슷한 것이 있는지 확인하지만 명확하지 않은 복제본을 놓치면 괜찮습니다.
—
Marc Glisse
@MarcGlisse보고 : gcc.gnu.org/bugzilla/show_bug.cgi?id=91990
—
Ruslan