2015-08-01 14 views
6

Mam uczciwą wiedzę na temat sposobu kompilacji parametrów szablonu-szablonu. Ale czy szablony nietypowe zostaną skompilowane w ten sam sposób?Jak można skompilować parametry szablonu non-type?

Na przykład, z typu szablonu takich jak to:

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

Powyższy dostanie skompilowany do oddzielnych definicji klas dla int i char:

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

Kiedy templating parametry non-Type, czy kompilator robi to w ten sam sposób? Na przykład:

template<int N> 
class NumericClass { 
    int array[N]; 
    ..do something else with N.. 
}; 
NumericClass<3> Class3; 
NumericClass<5> Class5; 

Czy wygeneruje to oddzielne definicje klas dla każdej wartości numerycznej, jak poniżej?

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

Jeśli tak, to nie może to prowadzić do tonę nadęty skompilowanego kodu, jeśli istnieje znacząco duża liczba możliwości numerycznych dla parametru szablonu? Mogłem mieć statyczną klasę tablicową zdefiniowaną za pomocą szablonu numerycznego w moim głównym API. Za każdym razem, gdy zadeklarowałem instancję o unikalnej wartości długości, musiałbym dla niej skompilować nową definicję klasy. Może to prowadzić do absurdalnie dużej liczby skompilowanych definicji, zakładając, że mój kod jest otwarty.

O ile mi wiadomo, nadal zaleca się praktykę. Czy kompilator ma w jakiś inny sposób do czynienia z szablonami nietypowymi? Czy też koszty ogólne z tego skompilowane w ten sposób nie są tak znaczące?

+6

Tak, każda inna liczba będzie stanowić odrębną klasę. –

+0

Cóż, jeśli naprawdę tego potrzebujesz (nawet po możliwych optymalizacjach), pamięć nie może pochodzić z kosmosu. – edmz

+0

[Itanium C++ ABI] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.template-arg) pokazuje jeden ze sposobów w jaki można przekodować argumenty szablonu na nazwy (szablon klasy, funkcja członkowska szablonu klasy, ..) specjalizacje. (Zwróć uwagę, jak [wyrażenia są zniekształcone] (http://mentorembedded.github.io/cxx-abi/abi.html#mangle.expr-primary).) – dyp

Odpowiedz

3

Każda instancja szablonu jest pojęciowo inną jednostką. Kompilator może utworzyć inny kod dla każdej instancji. Nie ma znaczenia, czy argumenty szablonu są argumentami typu, czy też nie. Kompilator może być w stanie współdzielić kod między różnymi wystąpieniami i nadawać różne symbole temu samemu kodowi obiektowemu, ale na pewno nie ma na to żadnego polecenia (nadal potrzebne jest trochę pamięci dla symboli przynajmniej do czasu, gdy kod zostanie połączony).

W rezultacie ważne może być ustrukturyzowanie implementacji w sposób minimalizujący kod, który jest specyficzny dla argumentów szablonu. Na przykład rozsądne może być kodowanie wspólne dla wielu wystąpień w klasie bazowej (zakładając, że funkcja musi być funkcją członka). W przypadku pozostałych kodów uzasadnione jest, aby był on raczej mały, aby można go było wstawiać i nie tworzyć żadnych narzutów, jeśli jest on mniejszy niż kod potrzebny do wywoływania funkcji i powrotu z nich.

Powiązane problemy