Korzystam z programu Visual Studio 2012, a on ma przypadki, w których dodaliśmy parametry szablonów do klasy „tylko” w celu wprowadzenia „punktu szwu”, aby w teście jednostkowym mogliśmy zastąpić te części próbnymi obiektami.
Jak zwykle wprowadzasz punkty szwu w C ++: używając interfejsów i / lub mieszając na podstawie niektórych kryteriów z interfejsami niejawnymi, używając również parametrów szablonów? Jednym z powodów, dla których warto o to zapytać, jest to, że czasami podczas kompilacji pojedynczy plik C ++ (zawierający pliki szablonów, które mogą również zawierać inne szablony) powoduje wygenerowanie pliku obiektowego, który zajmuje około 5-10 sekund na komputerze programisty .
O ile rozumiem, kompilator VS nie jest szczególnie szybki w kompilowaniu szablonów, a także ze względu na model włączenia szablonów (praktycznie dołączasz definicję szablonu do każdego pliku, który używa go pośrednio i być może tworzysz go ponownie za każdym razem, gdy modyfikujesz coś, co nie ma nic wspólnego z tym szablonem) możesz mieć problemy z czasami kompilacji (podczas kompilacji przyrostowej).
Jakie są twoje sposoby obsługi przyrostowego (i nie tylko) czasu kompilacji podczas pracy z szablonami (oprócz lepszego / szybszego kompilatora :-)).
Odpowiedzi:
Jeśli parametry szablonów mogą przyjmować tylko skończony (i mały) zestaw wartości, możesz przenieść ich definicję do pliku źródłowego i użyć jawnej instancji .
Na przykład,
aaa.h
deklarujesz tylko funkcje szablonuf
ig
:Zakładamy
n
szablonu parametr może być tylko 1, 3, 6 iT
parametr szablonu może być tylkoint
,long
ivoid *
.Następnie definiujesz je w
aaa.cpp
następujący sposób:W ten sposób kompilator tworzy instancję szablonu dla podanych parametrów podczas kompilacji
aaa.cpp
. Podczas kompilowania kodu klienta zakłada się, że gdzieś istnieją definicje, a linker się tym zajmie.Możesz także jawnie tworzyć instancje klas szablonów. Wadą jest to, że nie można użyć
f
lubg
z innymi parametrami szablonu.prowadzi do
Zastosowałem tę technikę w projekcie, w którym kilka złożonych klas zależało od małego (<10) zestawu parametrów szablonu liczb całkowitych, co znacznie skróciło czas kompilacji (ponieważ kompilator nie musiał analizować złożonych definicji szablonów podczas kompilowania kodu klienta) . Oczywiście możesz uzyskać mniejsze ulepszenia, w zależności od rzeczywistego kodu.
źródło
Kiedyś użyłem dziwnego rozwiązania podobnego problemu: Uwzględnienie odprowadzenia STL do czasów kompilacji, takich jak kilka sekund na plik źródłowy - bez względu na to, jak mały. Więc zawarłem wszystkie moje pliki źródłowe w jednym pliku głównym, a czas kompilacji na plik prawie się nie zmienił ... co oznaczało przyspieszenie 20+, ponieważ miałem tylko jeden plik do skompilowania.
Aby utrzymać projekt w czystości, nadal utrzymywałem plik makefile, ale nigdy go nie użyłem (z wyjątkiem weryfikacji, czy nadal działa).
źródło
Kiedyś odpalaliśmy duże zadanie, aby skompilować nasze wstępnie skompilowane nagłówki i szablony w ciągu jednej nocy, i po prostu zbudować z tymi następnego dnia.
źródło