我正在使用glm
library,它是用于 3D 图形的仅限标题的数学实用程序集合。通过-ftime-trace
在 Clang 和 上使用ClangBuildAnalyzer
,我注意到很多时间都花在实例化glm
类型上:
**** Templates that took longest to instantiate:
16872 ms: glm::vec<4, signed char, glm::packed_highp> (78 times, avg 216 ms)
15675 ms: glm::vec<4, unsigned char, glm::packed_highp> (78 times, avg 200 ms)
15578 ms: glm::vec<4, float, glm::packed_highp> (78 times, avg 199 ms)
...
因此,我决定为 . 创建一个包装头/源对glm
,并使用它extern template
来避免不必要的实例化:
// glmwrapper.h
#pragma once
#include <glm.hpp>
extern template struct glm::vec<4, signed char, glm::packed_highp>;
extern template struct glm::vec<4, unsigned char, glm::packed_highp>;
extern template struct glm::vec<4, float, glm::packed_highp>;
// glmwrapper.cpp
template struct glm::vec<4, signed char, glm::packed_highp>;
template struct glm::vec<4, unsigned char, glm::packed_highp>;
template struct glm::vec<4, float, glm::packed_highp>;
现在,在我的项目中<glm.hpp>
,我不包含,而是包含"glmwrapper.h"
。不幸的是,这并没有改变任何东西。使用-ftime-trace
andClangBuildAnalyzer
再次报告相同数量的实例化。也没有可测量的编译时间差异。
我怀疑这是因为#include <glm.hpp>
实际上最终包含了模板定义,而在这一点上,后续extern template
声明只是多余的。
有没有办法在不修改库的情况下实现我想要的glm
?
在伪代码中,我有点想要这样的东西:
// glmwrapper.h (psuedocode)
#pragma once
#include <glm.hpp>
// Make definition of the templates unavailable:
undefine template struct glm::vec<4, signed char, glm::packed_highp>;
undefine template struct glm::vec<4, unsigned char, glm::packed_highp>;
undefine template struct glm::vec<4, float, glm::packed_highp>;
// Make declaration of the templates available:
extern template struct glm::vec<4, signed char, glm::packed_highp>;
extern template struct glm::vec<4, unsigned char, glm::packed_highp>;
extern template struct glm::vec<4, float, glm::packed_highp>;
// glmwrapper.cpp (psuedocode)
// Define templates only in the `.cpp`, not in the header:
template struct glm::vec<4, signed char, glm::packed_highp>;
template struct glm::vec<4, unsigned char, glm::packed_highp>;
template struct glm::vec<4, float, glm::packed_highp>;