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::vec3
は
glm::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
は暗黙的なインスタンス化を引き起こすべきではありません。 しかし、コンパイル時間は私がそれをしないのと同じです。
AFAIK、明示的なインスタンス化は、テンプレート宣言を別の.cppファイルに移動し、必要なテンプレートのみを明示的にインスタンス化すると、コンパイル時間の短縮に役立ちます。ヘッダーのみのライブラリではそうではありません。さらに悪いことに、クラスを明示的にインスタンス化すると、未使用のシンボルを含むすべてのシンボルが生成されます。 –
@AndreiR。暗黙のインスタンシエーションを避けるために、**テンプレート実装を隠す必要はありません。そのため、コンパイラは他の翻訳単位でそれを検索しなければなりません。これは、コンパイラに現在のものをインスタンス化するのではなく、他の翻訳単位での実装を検索させるための、 'extern template'の全体のポイントです。 – PcAF
@PcAFしかし、この例はうまくいくはずですか? – hidayat