仅标头模板的显式实例化声明(外部模板)

问题描述 投票:0回答:1

我正在尝试加快 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>;

然后我有三个使用

glm::vec3
模板的文件,
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
不应导致隐式实例化。 但编译时间和我不这样做一样。

c++ c++11 templates extern explicit-instantiation
1个回答
-1
投票

您的 math.h 仍然会导致用户包含
这就是你要避免的事情,以加快速度。为了加快速度,请创建您自己的类,其实现(在 math.cpp 内)可能使用 glm.hpp,但该类的用户不需要自己包含 glm.hpp。

这是留给学生的一个例子,但你想要类似的东西:

数学.h
struct vec3{ 双 x1,x2,x3};
vec3 plus(const vec3& a, const vec3& b);

那么当a.cpp包含math.h时,它提供了你需要的函数,但并不会让你所有的编译单元都包含glm.hpp。

© www.soinside.com 2019 - 2024. All rights reserved.