2017-01-26 17 views
8

GLM(OpenGL Mathematics)のコンパイル時間を短縮しようとしています。 GLMはC++テンプレートを大量に使用しています。ヘッダーのみのテンプレートの明示的なインスタンス化宣言(externテンプレート)

これはこれまで私が試したことです。

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>; 


そして、私は glm::vec3テンプレートを使用している3つのファイルを持っているが、 glm::vec3glm::tvec3<float, glm::highp>のtypedefです。三つのファイル a,b,cはほぼ同じになります。

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; 
} 

私は明示的なインスタンスの定義と明示的なインスタンス宣言の両方を使用しています。したがって、ファイルa,b,cは暗黙的なインスタンス化を引き起こすべきではありません。 しかし、コンパイル時間は私がそれをしないのと同じです。

+1

AFAIK、明示的なインスタンス化は、テンプレート宣言を別の.cppファイルに移動し、必要なテンプレートのみを明示的にインスタンス化すると、コンパイル時間の短縮に役立ちます。ヘッダーのみのライブラリではそうではありません。さらに悪いことに、クラスを明示的にインスタンス化すると、未使用のシンボルを含むすべてのシンボルが生成されます。 –

+0

@AndreiR。暗黙のインスタンシエーションを避けるために、**テンプレート実装を隠す必要はありません。そのため、コンパイラは他の翻訳単位でそれを検索しなければなりません。これは、コンパイラに現在のものをインスタンス化するのではなく、他の翻訳単位での実装を検索させるための、 'extern template'の全体のポイントです。 – PcAF

+0

@PcAFしかし、この例はうまくいくはずですか? – hidayat

答えて

0

あなたのmath.hには依然としてユーザーが含まれています< glm \ glm.hpp>
これは、スピードを上げるために避けたいことです。処理を高速化するには、実装(math.cpp内で)がglm.hppを使用するかもしれない独自のクラスを作成しますが、そのクラスのユーザはglm.hpp自身をインクルードする必要はありません。

これは学生に任さ一例ですが、あなたのような何かしたい:

のmath.h
構造体vec3 {ダブルX1、X2、X3を};
vec3 plus(const vec3 & a、const vec3 & b)。

その後、a.cppにmath.hが含まれていると、必要な機能が提供されますが、すべてのコンパイル単位にglm.hppが含まれるわけではありません。

関連する問題