Próbuję przyspieszyć czas kompilacji GLM (Matematyka OpenGL). GLM tworzy ciężkie zastosowania szablonów C++.Jawna deklaracja wystąpienia szablonu tylko nagłówka (szablon zewnętrzny)
To jest to, czego próbowałem do tej pory.
math.h
#pragma once
#include <glm\glm.hpp>
extern template struct glm::tvec3<float, glm::highp>;
math.cpp
#include "math.h"
template struct glm::tvec3<float, glm::highp>;
A potem mam trzy pliki, które są przy użyciu szablonu glm::vec3
, glm::vec3
jest typedef z glm::tvec3<float, glm::highp>
. Trzy pliki a,b,c
wygląda prawie tak samo:
a.cpp, b.cpp, c.cpp
#include "math.h"
glm::vec3 func() {
glm::vec3 a = glm::vec3{1,1,1};
glm::vec3 b = glm::vec3{1,1,1};
return a + b;
}
używam zarówno wyraźnej definicji instancji i wyraźnej deklaracji instancji. Tak więc pliki a,b,c
nie powinny powodować niejawnej instancji. Ale czas kompilacji jest taki sam, jak gdybym tego nie robił.
AFAIK, instancja jawna może jedynie przyspieszyć kompilację, jeśli przeniesiesz deklaracje szablonu do oddzielnego pliku .cpp i jawnie utworzysz tylko wymagane szablony. Tak nie jest w przypadku bibliotek tylko nagłówkowych. Co gorsza: jawnie tworzenie instancji klasy spowoduje wygenerowanie wszystkich jej symboli, w tym nieużywanych –
@AndreiR. ** nie musisz ukrywać ** implementacji szablonu, aby uniknąć niejawnej chwili i tym samym zmusić kompilator do wyszukania go w innej jednostce tłumaczeniowej. Właśnie o to chodzi w "szablonie zewnętrznym" -> aby zmusić kompilator do szukania implementacji w innej jednostce tłumaczeniowej zamiast do natychmiastowej aktualizacji jej w aktualnej. – PcAF
@PcAF, ale ten przykład powinien zadziałać, czy nie powinien? – hidayat