Neden bu kodun g ++ ile derlenmesi çok uzun sürüyor?


12

Aşağıdaki kodu göz önünde bulundurun:

template<int i> class A
{
    typedef A<i-1> B;
    B x, y;
};
template<> class A<0> { char m; };
int main()
{
    A<LEVEL> a;
}

Aşağıdaki Bash komutuyla derlemesini g ++ ile karşılaştırırken (g ++ 8.3.0 ile)

for ((level=1; level<30; ++level)); do
    echo -n ${level},
    /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp -o /dev/null
done

Aşağıdaki çıktıyı alıyorum:

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

Yani, derleme süresi üsteldir LEVEL. Ben değiştirmek Ama eğer B x, y;için B x[2];, daha sonra derleme sabiti süresi (~ 30 ms) olur.

Neden oluyor? Ben derleyici bilir çünkü düşündüm Bbir ve ikisi için de aynı türüdür xve ybu derleme ile aynı zaman alacağını, x[2]. Ancak bazı nedenlerden dolayı farklı görünüyor. Her nasılsa Bg ++ 'ın diziyi oluşturduğu kadar kolay bir şekilde her iki değişkeni de oluşturabilmesi için (basitçe takma adın aksine) gerçekleştirilmeye zorlanabilir miyim ?


1
Teknik olarak doğru ama işe yaramaz (sizin için) bir cevap: derleyiciyi yamalayın.
Botje

5
Bunu neden buraya gönderdin? Gcc, sorunları bildirmek için bir bugzilla'ya sahiptir ... Yine de en son sürümle test ettiğinizden emin olun.
Marc Glisse

@MarcGlisse İyi bir açıklama veya geçici bir çözüm olabileceğini umuyordum. Böyle bildirdiysem düzeltmeye çalışırken bir hata olarak değerlendirilip değerlendirilmeyeceğinden emin değilim.
Ruslan

3
Hatta derleyicinin derlemek için çok uzun sürdüğü durumlar için "compile-time-hog" anahtar kelimesine sahiptirler, bu yüzden evet, düzeltmeye değer olduğunu düşünürler (bu, hemen yapacakları anlamına gelmez). Özellikle üstel davranışa sahip olmayan başka bir derleyici görüyorsanız (önlenebilir olduğunu biliyorsunuz), lütfen bildirin. Belki de veritabanında çok benzer bir şey görüp görmediğinizi kontrol edin, ancak açık olmayan bir kopyayı kaçırırsanız sorun olmaz.
Marc Glisse

Yanıtlar:


1

Çünkü g ++ örneğinizde bir hata var. Olmamalı ve @Marc Glisse'nin yorumladığı gibi, rapor etmelisiniz (yazarken yaptığınız)

O zaman sorunuzu silmek isteyebilirsiniz (daha akıllıca bir seçim). Veya bu cevabı kabul edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.