将`extern template`与第三方标头库一起使用

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

我正在使用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
c++ c++11 templates extern explicit-instantiation
1个回答
0
投票

如果您的怀疑是正确的,并且由于某种原因,库甚至在考虑您的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>;
© www.soinside.com 2019 - 2024. All rights reserved.