代码之家  ›  专栏  ›  技术社区  ›  seaotternerd

非模板类的显式类实例化

  •  0
  • seaotternerd  · 技术社区  · 6 年前

    在C++中,可以显式实例化模板化的类,例如:

    template class A<B>;
    

    这将强制编译器包含该类的所有方法的输出,这对于评估哪些方法被测试覆盖非常有用。

    虽然(据我所知)非模板化类在技术上是自动实例化的,但非模板化类的未使用方法通常会从编译器的输出中漏掉(即使使用-o0和其他类似的标志)。有没有办法强迫编译器不这样做?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Guillaume Racicot    6 年前

    没有使用非模板类实例化的概念。当编译器遇到成员函数的定义时,将立即编译该定义。

    函数是否以二进制输出取决于编译器和您的设置。如果将程序编译为库,则将实现所有函数。如果使用静态链接,则链接器不会在二进制文件中添加未使用的函数。

    相反,如果使用动态链接,则所有导出的定义都将存在。尽管非导出函数(如具有静态链接的函数)可以内联,而无需单独定义。

    它们是否真的被保存并输出到二进制文件中是与编译本身分离的。例如,可以实例化100个模板函数,而实际上二进制文件中没有输出任何模板函数。如果您的函数能够到达二进制文件,则取决于链接器。

    如果你的函数是一个公共符号,它很可能会进入二进制文件。

        2
  •  0
  •   seaotternerd    6 年前

    我没有找到一个动态链接的解决方案(我只写头库的原因是我讨厌有激情的链接器),但是在这一过程中,我在clang中发现了一些内置的编译器选项,它们实现了我想要的。我添加了 -fprofile-instr-generate -fcoverage-mapping 标记到我的编译,然后使用llvm profdata和llvm cov查看测试覆盖率(如所述 here )

    请注意,对于任何其他尝试使其工作的人:请确保对所有这三个命令(clang、llvm profdata和llvm cov)使用相同的llvm版本。