Почему этот код так долго компилируется с g ++? - PullRequest
11 голосов
/ 04 октября 2019

Рассмотрим следующий код:

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 ++ с помощью следующей команды Bash (с 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 мс).

Почему это происходит? Я думал, что, поскольку компилятор знает, что B - это один и тот же тип для x и y, это займет то же время, что и для компиляции x[2]. Но почему-то это выглядит иначе. Могу ли я как-то заставить B быть реализованным (в отличие от просто псевдонимом), чтобы g ++ мог создавать обе переменные так же легко, как и массив?

...