调试模板

时间:2014-03-31 14:49:03

标签: c++ debugging templates compilation template-meta-programming

任何以某种形式使用泛型编程或模板元编程的人都会遇到诸如意外的长编译时间,大型可执行文件,深度嵌套的编译器错误消息或填写整个屏幕的类型名称等问题。

最近一个不幸的例子是"unexpected" instantiation of unused functions。仅仅是为了激励,今天我又有了一个意想不到的"一系列事件:

  • T;
  • 正在测试std::is_empty类型
  • SFINAE的实现(除非内置),从D派生出另一种类型,例如T;
  • 可能在为D生成隐式赋值运算符时,T的(用户定义的)泛型赋值运算符被实例化;
  • 由于std::enable_if,此运算符实例化std::is_assignable <M, T>其中MT的成员或基类型,以及与{{1}相同的类模板的实例}};
  • 最终,T上的类型特征TR被实例化,需要T;在这一点上,我得到一个错误,因为某些类型不完整。

我可以使用std::is_empty <T>的一些特化来轻松修补此问题,因为在特定情况下并不真正需要TR。 &#34;轻松&#34;意味着大约需要两个小时来分析错误消息。有趣的是,当我从其他地方删除一个从未使用过的无条件赋值运算符时,所有这些都被揭示出来了(#{远距离&#34;基类std::is_empty)。该补丁也加快了编译速度,但我不会调查是否错误。

过去我看过编译时间下降,例如通过小的或更大的补丁从2分钟到10秒,随机出现或者带有一点想象力。

问题是:是否有系统方法或工具来控制在等待我们的模板代码编译时发生的事情,这将有助于我们改进代码,即使它的工作方式与我们在运行时调试程序的方式类似吗?

我见过的唯一(或最好)工具是Templight,它适用于clang并需要编译器补丁。它的Meeting C++ slides看起来很酷,但在尝试之前我会很感激任何相关的想法。

我发现的其他问题/资源是

但是已经过时了。

0 个答案:

没有答案