2010-07-27 9 views

Odpowiedz

5

Powinny one skrócić rozmiar źródła (jeśli są ponownie użyte), ale nie rozmiar binarny (szablon jest kompilowany dla każdego innego wystąpienia).

To różni się od generycznych Java, gdzie występuje pełne wymazywanie typów (generyczne służą tylko jako weryfikacja typów w czasie kompilacji typów) lub C#, gdzie generics są kompilowane do konkretnych plików binarnych, które mogą być bezpośrednio ponownie użyte bez konieczności ponownego kompilowania i generowania więcej kodu.

0

Rozmiar binarny zależy od kompilatora i optymalizacji wykonywanych przez kompilator w celu zmniejszenia rozmiaru kodu poprzez eliminację redandantowego kodu.

Nowoczesne kompilatory są w stanie wykryć nadmiarowy kod, więc rozmiar binarny nie zwiększy się dramatycznie przy użyciu szablonów.

+0

Wątpię, czy kompilator może zrobić więcej przy użyciu szablonów niż przy niesformatowanych funkcjach. Szablony mają powiązania zewnętrzne, więc nie można ich usunąć z pliku obiektowego, a każda technika, za pomocą której można zredukować wewnętrzny kod szablonu, będzie również używana dla kodu niemormowanego. –

2

Rozumiem, że dla każdego typu utworzyć wystąpienia z szablonem kompilator produkuje odpowiedniej klasy pasujące do tego typu - więc jeśli używasz List<int>, List<foo> i List<float> będzie skutecznie trzy różneList zajęcia w swojej spełnione binarny .

Edit:
czego nie było wyraźnie stan że ja wywodząc, że łączenie kilku klas w do jednego szablonu (prawdopodobnie) nie zmniejsza rozmiaru binarny, ale należy zmniejszyć rozmiar twoje źródło.

+1

Twoje zrozumienie jest dobre, a także zauważ, że (o ile ręcznie nie utworzysz klasy), tylko te metody, które są faktycznie używane, zostaną skompilowane. Nie dodałem tego do mojej odpowiedzi, ponieważ linkery mogą usunąć nieużywany kod z pliku binarnego, więc podobna optymalizacja miejsca jest dostępna dla kodu niezwiązanego z szablonem i nie ma to znaczenia. +1 –

0

Szablony zdecydowanie będą sposobem na napisanie bardziej ogólnego i krótszego kodu. Zamiast wpisywać swoją funkcję n razy, aby poradzić sobie z różnymi typami parametrów, zapisujesz ją raz typowym typem dla parametru.

Jeśli chodzi o rozmiar binarny, zostanie wygenerowany kod dla wystąpień szablonu, to znaczy, gdy zostanie określony typ. Nie widzę, jak to skracałoby binarne rozmiary.

2

To zależy ... Jeśli zamierzałeś zaimplementować dla każdego typu oddzielną klasę, zmniejszy się rozmiar kodu źródłowego.

W wersji binarnej najprawdopodobniej nie widać żadnej znaczącej różnicy, ponieważ jeśli zamierzałeś zaimplementować oddzielną klasę dla każdego typu, a nie zrobiłeś tego, ponieważ używałeś szablonów, nie znaczy to, że zmniejszy się rozmiar binarny , ponieważ ten kod zostanie wygenerowany przez kompilator (dla instancji), więc nie możesz mieć żadnej znaczącej różnicy, ponieważ "kod jest taki sam".

Powiązane problemy