이 코드가 왜 g ++로 컴파일하는데 시간이 오래 걸립니까?


12

다음 코드를 고려하십시오.

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하나 모두 동일 유형 xy는 컴파일과 동일한 시간이 걸릴 것이다 x[2]. 그러나 어떤 이유로 든 다르게 보입니다. Bg ++이 배열을 만드는 것처럼 쉽게 두 변수를 만들 수 있도록 어떻게 든 간단하게 앨리어싱과 달리 실현시킬 수 있습니까?


1
기술적으로 정확하지만 쓸모없는 답변 : 컴파일러를 패치하십시오.
Botje

5
왜 여기에 게시 하시겠습니까? Gcc에는 문제보고를위한 버그질라가 있습니다 ... 먼저 최신 버전으로 테스트하십시오.
Marc Glisse

@ MarcGlisse 좋은 설명이나 해결 방법이 있기를 바랍니다. 내가보고 한 경우 수정하려고하는 버그로 간주되는지 확실하지 않습니다.
Ruslan

3
컴파일러가 컴파일하는 데 너무 오래 걸리는 경우에는 "compile-time-hog"라는 키워드도 있으므로 수정해야 할 가치가 있다고 생각합니다 (즉, 즉시 수행한다는 의미는 아닙니다). 따라서 특히 지수 동작이없는 다른 컴파일러를 볼 수 있다면 (그러므로 피할 수 있음을 알고 있음)보고하십시오. 데이터베이스에 매우 비슷한 것이 있는지 확인하지만 명확하지 않은 복제본을 놓치면 괜찮습니다.
Marc Glisse

답변:


1

g ++ 인스턴스에 버그가 있기 때문입니다. @Marc Glisse가 언급 한대로보고하지 말아야합니다 (작성 당시 작성한 내용).

질문을 삭제하고 싶을 수도 있습니다 (더 현명한 선택). 아니면이 대답을 받아들이십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.