2015-08-01 21 views
6

Tür şablon parametrelerinin nasıl derlendiğini anladım. Ancak, türü olmayan şablonlar da aynı şekilde derlenir mi? Böyle bir tip şablonla ÖrneğinTürlü olmayan şablon parametreleri nasıl derlenir?

:

yukarıda
template<typename T> 
class TemplatedClass { 
    ..do something with T.. 
}; 
TemplatedClass<int> IntClass; 
TemplatedClass<char> CharClass; 

int ve char için ayrı sınıf tanımlarına derlenmiş olur:

class TemplatedClass<int> { 
    ..do something with int.. 
}; 
class TemplatedClass<char> { 
    ..do something with char.. 
}; 

olmayan tip parametrelerini templating, Derleyici aynı şekilde yapar mı? Örneğin: Aşağıdaki gibi her sayısal değer için ayrı sınıf tanımları oluşturur muydu? Bu, aşağıdaki gibi her sayısal değer için ayrı sınıf tanımları oluşturur mu? Eğer öyleyse

class NumericClass3 { 
    int array[3]; 
    ..do something else with 3.. 
}; 
class NumericClass5 { 
    int array[5]; 
    ..do something else with 5.. 
}; 

, şablon parametresi için sayısal olasılıklar önemli ölçüde sayıda şişirilmiş derlenen kodun bir ton yönlendiren vardır bulunamazsa? Temel API'mde sayısal bir şablonla tanımlanmış bir statik dizi sınıfına sahip olabilirdim. Sonra her zaman benzersiz bir uzunluk değerine sahip bir örnek ilan ettim, bunun için yeni bir sınıf tanımı derlemek zorunda kalacaktı. Bu, kodumun açık uçlu olduğunu varsayarak, çok sayıda derlenmiş tanımlamaya yol açabilir. Bildiğim kadarıyla, bu hala teşvik edilmiş bir uygulamadır. Derleyici daha sonra tip olmayan şablonlarla uğraşmanın başka bir yoluna sahip mi? Ya da bu şekilde derlenmesini gerektiren genel giderler bu kadar önemli değil midir?

+6

Evet, her bir farklı sayı farklı bir sınıfı yok edecektir. –

+0

Eğer gerçekten ihtiyacınız varsa (olası optimizasyonlardan sonra bile), bellek alandan gelemez. – edmz

+0

[Itanium C++ ABI] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.template-arg) şablon argümanlarının (sınıf şablonu) adlarına nasıl eklenebileceğinin bir yolunu gösterir. sınıf şablonunun üye işlevi, ..) uzmanlık. ([İfadelerin nasıl karıştırılacağını unutmayın] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.expr-primary).) – dyp

cevap

3

Her şablon örneği, kavramsal olarak farklı bir varlıktır. Derleyici, her örnekleme için farklı kodlar oluşturabilir. Şablon argümanlarının tip mi yoksa tür olmayan argümanlar mı olduğu önemli değil. derleyicisi kodunu farklı örneklemeler arasında kod paylaşabilir ve aynı nesne koduna farklı semboller verebilir, ancak bunu yapmak için kesinlikle bir yetki yoktur (en azından kod bağlı olana kadar semboller için gerekli bazı depolama alanı vardır). Sonuç olarak, uygulamaların şablon argümanlarına özgü kodu en aza indirecek şekilde yapılandırılması önemli olabilir. Örneğin, birden çok örneklemede ortak olan kodun bir temel sınıfa katılması makul olabilir (işlevlerin bir üye işlevinin olması gerektiği varsayılarak). Kalan kod için oldukça küçük hale getirilmesi mantıklıdır, bu nedenle satır içi ve işlev çağırmak ve bunlardan dönmek için gerekli olan koddan daha küçükse, herhangi bir ek yük oluşturmaz.

İlgili konular