我正在使用glm
library,这是用于3D图形的数学实用程序的仅标头集合。通过在Clang和glm
上使用-ftime-trace
,我注意到实例化ClangBuildAnalyzer
类型花了很多时间:
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"
报告相同数量的实例。也没有可测量的编译时差。
I suspect这是因为-ftime-trace
实际上确实包含了模板定义,并且在这一点上,后续的ClangBuildAnalyzer
声明只是多余的。
是否有一种无需修改ClangBuildAnalyzer
库即可实现我想要的方法的方法?
用伪代码,我有点想要这样的东西:
#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>;