【发布时间】:2018-09-26 11:15:44
【问题描述】:
问题
我正在将 C++ 库移植到 macOS(使用 Clang 编译器)。它似乎在某个时候卡住了,将编译时间延迟了 60+ 分钟。隔离问题后,我发现这是由这个怪物模板定义引起的(替换的类名):
auto table = std::make_shared<ClassE<ClassD<ClassC<ClassB<ClassA>>>>(loader);
所有类都是模板并包含构造函数(ClassA除外)类似这样:
template<typename T> class ClassB: public T {
public:
template<typename...ARGS> ClassB(ARGS&&...args):T(args...){}
//...
};
当我删除该模板代码行时,它会在几秒钟内正常编译。它适用于 Windows (Visual Studio) 和 Linux 平台,因此它可能被 macOS 编译器(XCode、Apple 的 LLVM、Clang)破坏。
问题
我想避免修复所有类,有没有办法,如何重写该定义以解决编译速度非常慢的问题?
【问题讨论】:
-
编译时间不一定在您在此处显示的那一行,而更有可能在类的代码中。如果您不使用这些模板的实例化,它们将不会被编译,这将解释编译时间的极度下降。您在此处显示的内容并不能解释 60 分钟的编译...
-
模板 B..E 看起来微不足道(除非有 很多 代码或您未显示的其他依赖项:构造函数本身并不复杂)。如果你只是
make_shared<ClassA>(loader)会发生什么?make_shared<ClassB<ClassA>>(loader)呢?您应该能够看到减速发生的位置。