我可以检查哪些函数模板至少被实例化过一次吗?

Posted

技术标签:

【中文标题】我可以检查哪些函数模板至少被实例化过一次吗?【英文标题】:Can I check which function templates have, or have not, been instantiated at least once? 【发布时间】:2012-01-20 01:25:22 【问题描述】:

我有很多模板代码。由于错误的模板代码除非被编译,否则不会引发编译器错误,有什么方法可以检查编译器实际“编译”了哪些模板函数,哪些被完全忽略了?

编辑 2:

如果一个特定的类模板函数模板 被实例化一次,对于任何参数类型,那都可以。我想要从未以任何形式实例化的函数/类模板列表。

一个具体的例子如下。它们是两个不同的模板函数,我想知道是否其中一个或两个都从未实例化。

template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag )

template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, random_access_iterator_tag )

编辑:目前,对于类,我在 .cpp 文件中手动实例化它们,如下所示:

template TClass<int>;

对于我感兴趣的所有类型。这很好。但那是如果我记得这样做的话。有时我需要编写很多小的模板类/函数,但我忘记手动实例化一些函数/类模板,以后会发现。我希望编译器告诉我。

或者,如果我可以获得已实例化的函数/类模板列表(对于任何参数),那么我可以将其与我可能在代码中使用 grep 查找的完整列表进行比较。

另一个好处是“测试”在模板类中编译了哪些方法,该模板类使用类型特征选择性地编译出某些函数。在继续之前,我想确定我选择正确功能的逻辑是正确的。

【问题讨论】:

如果可以检查,你会怎么做? @Jon:我会通过使用虚拟类型手动实例化它来测试它,以确保它的语法正确,至少对于我知道它可以采用的类型是正确的。 这就是您的答案:创建一个测试项目,您可以在其中调用 all 模板化函数,并使用您知道它们可以采用的 all 类型。如果项目没有编译你有问题。 :) 你想强制它为你感兴趣的类型编译所有模板吗?或者你想简单地发现哪些是编译的?我想你真的想要前者。如果后者是解决方案,那么它应该解决什么问题!? @Jon:哈哈,好吧,这正是我问这个的原因。作为人类,我们往往会错过一些东西。您最后一次计算程序中有多少类是什么时候 :P 但是编译器知道。我希望它在这种情况下也能帮助我。 【参考方案1】:

鉴于您使用的是 MSVC 2008,您可以通过生成链接器映射文件并搜索该函数的所有实例或通过 DIA 检查 .pdb 来完成此操作。您需要使用链接器标志 /OPT:NOICF 禁用 COMDAT 折叠,以便您可以找到恰好编译到同一程序集的函数。

【讨论】:

【参考方案2】:

有人提到“一切都可以通过添加间接级别来解决”——你可以为每个函数添加一个静态断言并观察编译失败:

template <typename T>
struct Asserter

  static const bool value = false;
;

template <typename T>
struct Foo

  void foo()
  
    static_assert(Asserter<T>::value, "Foo::foo() is being compiled.");
  
  void bar()
  
    static_assert(Asserter<T>::value, "Foo::bar() is being compiled.");
  
;

int main()

  Foo<int> f;
  //f.foo();  // static assertion!

如果您不希望编译在每一步都中断,您可以改为发出 Boost static warning 或具有类似效果的东西。

【讨论】:

我最终采用了这个解决方案,用对某个预处理器不执行任何操作的宏来包装断言。 “1 级间接”意味着额外的模板实例化(即在评估 Asserter&lt;T&gt;::value 时实例化的 Asserter&lt;T&gt;)?有趣的是它有效,知道为什么有效吗?【参考方案3】:

您可以在编译后通过静态分析工具运行您的可执行文件,前提是您已设置编译器以包含正确的符号表......这将显示所有实例化的类及其模板参数。 Here is a link 可用于静态代码分析的工具列表。

【讨论】:

以上是关于我可以检查哪些函数模板至少被实例化过一次吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 R 的替换函数中,数据真的被复制了四次吗?

Vue生命周期及钩子函数

等保四级适用于哪些领域?一年一次吗?

等保四级适用于哪些领域?一年一次吗?

等保四级适用于哪些领域?一年一次吗?

我可以调用 SparkContext 构造函数两次吗?