非模板化类的显式类实例化

时间:2018-06-06 19:12:06

标签: c++ testing

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

template class A<B>;

这迫使编译器将所有类的方法包含在其输出中,这对于评估测试涵盖哪些方法非常有用。

虽然(据我所知)非模板化的类在技术上会自动实例化,但非模板化类的未使用方法通常会被排除在编译器的输出之外(即使使用-O0和其他类似的标志)。有没有办法强制编译器不这样做?

2 个答案:

答案 0 :(得分:1)

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

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

相反,如果使用动态链接,则所有导出的定义都将存在。虽然非导出函数(如带静态链接的函数)可以在没有单独定义的情况下进行内联。

它们是否实际保存并输出到二进制文件中是与编译本身分开的。例如,您可以实例化100个模板函数,实际上在二进制文件中没有输出。如果您的函数使其成为二进制文件,则取决于链接器。

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

答案 1 :(得分:0)

我没有设法找到一个使用动态链接的解决方案(我编写仅限标题的库的原因是我讨厌具有激情的链接器),但在此过程中我发现了一些内置的编译器选项在Clang做了我想做的事。我在编译中添加了-fprofile-instr-generate -fcoverage-mapping标志,然后使用llvm-profdata和llvm-cov查看测试覆盖率(如here所述)。

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