什么是TMP缓慢的常见罪魁祸首

Emi*_*son 6 c++ gcc clang template-meta-programming

我有一个项目,它使用了相当多的C++模板元编程.这使编译时间变长.我知道我不能吃蛋糕并且也吃它但是我想知道如何减少编译时间的一些提示和技巧.我已经尝试过显式实例化,虽然这在某些情况下可能有所帮助,但很多时候,实例对于特定的编译单元是唯一的,在这种情况下,显式实例化无助于提供帮助.现在我们只谈论Clang做得很好.当我在G ++上尝试这个时,编译时间就会爆炸.对于一个文件,我放弃了等待它在45分钟后编译.

  • 在模板元编程方面是否有任何常见的罪魁祸首,众所周知的事情往往是有问题的?我应该避免哪些技术,我应该做些什么呢?
  • 是否有任何地区的GCC比Clang表现更差,有什么方法可以解决这个问题吗?

我使用的主要是普通的C++ 11技术,我不使用Boost MPL或类似的库.

que*_*en3 0

在我们的项目中,我们只是使用思考和尝试。即,首先我们思考“这里的复杂模板是什么”,然后我们尝试隔离这些模板或删除它们或重构以查看编译时间是否发生变化。通常,模板编译时间会伴随着内存使用量的增加,我什至报告了一次 gcc 错误(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54056)。

还有另一个技巧多次提供帮助,即使用 -Q 命令行开关(显示 gcc 当前编译的函数)。例如,对于上面链接的错误,很明显 gcc 在那些有错误的模板上减慢了速度。