Mam projekt, który wykorzystuje sporo metaprogramowania szablonu C++. To sprawia, że czas kompilacji jest długi. Rozumiem, że nie mogę mieć ciasta i jeść go, ale chciałbym poznać kilka wskazówek i porad dotyczących zmniejszania czasu kompilacji. Próbowałem już jawnych instancji i chociaż w niektórych przypadkach może to pomóc, wiele razy instancje są unikalne dla konkretnej jednostki kompilacji, w którym to przypadku jawne tworzenie instancji nic nie pomoże. A teraz mówimy tylko o Clangu, który wykonuje całkiem niezłą robotę. Kiedy próbuję tego w G ++, czas kompilacji właśnie wybucha. W przypadku jednego pliku przestałem czekać na kompilację po 45 minutach.Co jest częstym winowajcą powolności TMP
- Czy są jakieś powody, jeśli chodzi o meta-programowanie szablonowe, o których wiadomo, że często stanowią problem? Jakich technik należy unikać i co powinienem zrobić?
- Czy istnieją obszary, w których GCC jest znane z tego, że działa gorzej niż Clang i czy istnieje sposób obejścia tego problemu?
Używam głównie prostych technik waniliowych C++ 11, nie używam Boost MPL lub podobnych bibliotek.
Niestety, to są rzeczy, które już robię. Niektórymi rzeczami, które naprawdę zwiększyłem czasy kompilacji, było użycie 'std :: make_shared' i' std :: shared_ptr'. Zastąpiłem je własnymi odwołaniami liczącymi używając 'std :: atomic', ponieważ i tak robiłem typ kasowania. –
@EmilEriksson Możliwe jest nadal używanie 'std :: shared_ptr' i nie dostaniesz zbyt dużo dodatkowych kosztów http://blog2.emptycrate.com/content/template-code-bloat-revisited-smaller-makehared – lefticus
W tym przypadku nawet jeśli zmniejszyłem liczbę wystąpień 'std :: shared_ptr', nadal miałbym ich zbyt dużo i' std :: shared_ptr' jest droższy w tworzeniu instancji niż moja własna implementacja. Oczywiście, z dobrego powodu jest to kosztowne, że wymagana jest elastyczność w przypadku standardowej klasy biblioteki, która będzie używana wszędzie. Ale mam bardzo konkretny przypadek użycia i dzięki temu udało mi się skrócić czasy kompilacji za pomocą innego rozwiązania. –