Şablonlarla çalışırken derleme sürelerini nasıl uzatıyorsunuz?


13

Visual Studio 2012 kullanıyorum ve bir "dikiş noktası" tanıtmak için "sadece" bir sınıfa şablon parametreleri eklediğimiz durumlar var, böylece birim testinde bu parçaları sahte nesnelerle değiştirebiliriz.

Genellikle C ++ 'da dikiş noktalarını nasıl tanıtırsınız: arayüz parametrelerini kullanarak ve / veya şablon parametrelerini kullanarak örtülü arayüzlere sahip bazı kriterlere dayalı karıştırmayı da? Bunu sormanın bir nedeni, bazen tek bir C ++ dosyasını derlerken (şablon dosyalarını içeren, diğer şablonları da içerebilen) bir geliştirici makinesinde yaklaşık 5-10 saniye süren bir nesne dosyasının oluşturulmasına neden olmasıdır. .

VS derleyici de anladığım kadarıyla şablonları derleme konusunda hızlı değildir ve şablonlar dahil etme modeli nedeniyle (şablonun tanımını dolaylı olarak kullanan her dosyaya pratikte dahil edersiniz ve muhtemelen her şablonda her değişiklik yaptığınızda bu şablonla ilgisi olmayan bir şey), derleme zamanlarıyla (artımlı derleme yaparken) sorun yaşayabilirsiniz.

Şablonlarla çalışırken (daha iyi / daha hızlı bir derleyicinin yanı sıra :-)) derleme zamanını (ve sadece) derlemenin yolları nelerdir?


1
@RobertHarvey bağımlılığı enjeksiyonu şablon parametreleri kullanılarak yapılır. Bunları somutlaştırdığım üretim kodunda yavaş derleme sürelerim var.
Ghita

5
C ++ 11 kullanıyor musunuz? bkz. en.wikipedia.org/wiki/C%2B%2B11#Extern_template
mike30

2
Andrei Alexandrescu "Modern C ++ tasarımı" yazdığından, birçok C ++ programcısı herkes için şablonlar kullanmaları ve derleyicinin mümkün olduğunca işlemesine izin vermesi gerektiğini düşünüyor. Bu genellikle tanımladığınız etkilere yol açar. Önceden (ve halen diğer dilleri kullanan programcılar için), son kullanıcı için bazı CPU döngülerine daha fazla ihtiyaç duysa bile, şablonlar kullanmamak ve çalışma zamanı mekaniği ile bağımlılık enjeksiyonu gibi şeyleri işlememek kesinlikle tamamdı (neredeyse hiç fark etmeyecek) ). Dürüst olmak gerekirse, Robert'in% 100 doğru olduğundan eminim ve bu sizin böyle düşünüyor.
Doc Brown

1
@Ghita: Şablon meta programlamayı kullanan IMHO, karşılaştırılabilir gereksinimlerle STL gibi kütüphaneler yazmadığınız sürece, genellikle sadece erken bir optimizasyon biçimidir (ve bazen sadece aşırı doldurma). Daha büyük derleme süreleri, daha az bakım kolaylığı ve anlaşılması zor birçok hata iletisi için bazı performans kazancı ödünç alırsınız. "Harici şablonlar" kullanmak artık kısa vadede size yardımcı olabilir, ancak ayakkabılarınızda olsaydım, uzun vadeli iyileştirmeleri de düşünürdüm.
Doc Brown

4
@DocBrown. Tersine, derleme performansını artırmak için şablonlardan kaçınmanın erken bir optimizasyon olduğunu söyleyebiliriz . Şablonlar birçok sorun için ideal soyutlamalardır.
mike30

Yanıtlar:


9

Eğer Şablonlarınız parametreleri yalnızca sonlu (ve küçük) değerler kümesini varsayabiliriz, bir kaynak dosyada kendi tanımını taşımak ve kullanabilirsiniz açık örnekleme .

Örneğin, aaa.hyalnızca şablon işlevlerini bildirir fve g:

template <int n>
int f();

template <class T>
void g(int a);

Varsayalım nşablon parametresi sadece 1, 3, 6 olabilmektedir, ve Tşablon parametre sadece olabilir int, longve void *.

Sonra bunları şu şekilde tanımlarsınız aaa.cpp:

template <int n>
int f()
{
    ...
}

template <class T>
void g(int a)
{
    ...
}

template int f<1>();
template int f<3>();
template int f<6>();

template void g<int>(int a);
template void g<long>(int a);
template void g<void *>(int a);

Bu şekilde derleyici, derleme sırasında verilen parametreler için şablonu başlatır aaa.cpp. İstemci kodunu derlerken, tanımların bir yerde var olduğunu varsayar ve bağlayıcı bununla ilgilenir.

#include "aaa.h"

int main()
{
    f<1>();
    f<3>();
    f<6>();

    g<int>(5);
    g<long>(5);
    g<void *>(5);
}

Şablon sınıflarını da açıkça başlatabilirsiniz. Dezavantajı, diğer şablon parametreleriyle fveya kullanamamanızdır g.

#include "aaa.h"

int main()
{
    f<5>();
}

sonuç

undefined reference to `int f<5>()'

Bu tekniği birkaç karmaşık sınıfın küçük (<10) bir tamsayı şablon parametresi kümesine bağlı olduğu bir projede kullandım ve derleme süresini önemli ölçüde azalttı (derleyici istemci kodunu derlerken karmaşık şablon tanımlarını ayrıştırmak zorunda olmadığından) . Elbette, gerçek koda bağlı olarak daha az iyileştirme alabilirsiniz.


2

Bir kez benzer bir sorun için garip bir çözüm kullandım: STL dahil kaynak dosya başına birkaç saniye gibi derleme süreleri yol - ne kadar küçük olursa olsun. Bu yüzden tüm kaynak dosyalarımı tek bir ana dosyaya dahil ettim ve dosya başına derleme süresi neredeyse değişmedi ... derlemek için tek bir dosyam olduğu için faktör 20'den fazla bir hız anlamına geliyordu.

Tasarımı temiz tutmak için bir makefile sürdürmeye devam ettim, ama aslında hiç kullanmadım (hala çalıştığını doğrulamak dışında).


0

Önceden derlenmiş üstbilgilerimizi ve önceden derlenmiş şablonlarımızı bir gecede oluşturmak ve ertesi gün bunlara karşı oluşturmak için büyük bir görevi yerine getirirdik.

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.