2017-01-26 39 views
8

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ł.

+1

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 –

+0

@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

+0

@PcAF, ale ten przykład powinien zadziałać, czy nie powinien? – hidayat

Odpowiedz

0

Twoja math.h nadal powoduje, że użytkownicy włączają < glm \ glm.hpp>
To jest coś, czego chcesz uniknąć, aby przyspieszyć działanie. Aby przyspieszyć, stwórz własną klasę, której implementacja (wewnątrz math.cpp) może korzystać z glm.hpp, ale użytkownicy tej klasy nie muszą samodzielnie włączać glm.hpp.

To jest przykład lewej do studenta, ale chcesz coś takiego:

math.h
struct vec3 {double x1, x2, x3};
vec3 plus (const vec3 & a, const vec3 & b);

Następnie, gdy a.cpp zawiera math.h, zapewnia potrzebne funkcje, ale nie powoduje, że wszystkie twoje jednostki kompilacji zawierają glm.hpp.