提问人:hidayat 提问时间:1/26/2017 最后编辑:Jan Schultkehidayat 更新时间:10/1/2023 访问量:585
仅标头模板(extern template)的显式实例化声明
Explicit instantiation declaration of header only template(extern template)
问:
我正在尝试加快GLM(OpenGL数学)的编译时间。GLM 大量使用 C++ 模板。
这是我到目前为止尝试过的。
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>;
然后我有三个文件正在使用模板,是 的 typedef。这三个文件看起来几乎相同:glm::vec3
glm::vec3
glm::tvec3<float, glm::highp>
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赞
CHKingsley
11/30/2017
#1
您的 math.h 仍然会导致用户包含 <glm\glm.hpp>
这是您想要避免的事情,以加快速度。为了加快速度,请创建自己的类,其实现(在 math.cpp 中)可能使用 glm.hpp,但该类的用户不需要自己包含 glm.hpp。
这是留给学生的示例,但您想要如下内容:
math.h
结构 vec3{ double x1,x2,x3};
VEC3 Plus(康斯特VEC3&A,康斯特VEC3&B);
然后,当 a.cpp 包含 math.h 时,它提供了您需要的函数,但不会使所有编译单元都包含 glm.hpp。
评论
0赞
Jan Schultke
9/30/2023
即使包含标头,您仍然可以避免使用显式实例化的编译时间。标头只需要您解析其中的模板,而不是实例化它们。
评论
extern template