我试图用SO找到答案.有许多问题列出了在c ++中构建一个只有头文件库的各种优缺点,但是我无法找到一个以可量化的术语来构建这样的库.
因此,在可量化的术语中,使用传统上分离的c ++标头和实现文件与仅标头之间有什么不同?
为简单起见,我假设不使用模板(因为它们只需要标题).
详细说明,我列出了我从文章中看到的优点和缺点.显然,有些不容易量化(例如易用性),因此无法用于量化比较.我会用可量化的方式标记那些我期望可量化的指标.
仅限标题的优点
仅限标题的缺点
您可以从较大的开源项目(比较类似大小的代码库)中使用的任何示例都非常感激.或者,如果您知道可以在仅标题版本和分离版本之间切换的项目(使用包含两者的第三个文件),那将是理想的.轶事数字也很有用,因为它们给了我一个可以获得一些洞察力的球场.
利弊来源:
提前致谢...
更新:
对于可能稍后阅读并且有兴趣获得关于链接和编译的一些背景信息的任何人,我发现这些资源很有用:
更新:(回应下面的评论)
仅仅因为答案可能不同,并不意味着测量是无用的.你必须开始测量一些点.您拥有的测量值越多,图像就越清晰.我在这个问题上要求的不是整个故事,而是对图片的一瞥.当然,如果他们想要不道德地宣传他们的偏见,任何人都可以使用数字来扭曲争论.但是,如果有人对两个选项之间的差异感到好奇并发布这些结果,我认为这些信息很有用.
没有人对这个话题感到好奇,足以衡量它吗?
我喜欢枪战项目.我们可以从删除大部分变量开始.只在一个版本的linux上使用一个版本的gcc.仅对所有基准测试使用相同的硬件.不要使用多个线程进行编译.
然后,我们可以测量:
根据一个定义规则(ODR),我不能有一个功能
void function()
{
}
Run Code Online (Sandbox Code Playgroud)
在一个可执行文件中定义了多个 - 链接器将对象.但是,内联函数会忽略ODR:
inline void function()
{
}
Run Code Online (Sandbox Code Playgroud)
可以在头文件中定义#included到多个.cpp文件中,因此当结果.obj文件链接在一起时,链接器会看到该函数的几个实例并故意忽略它.它假设它是完全相同的函数,只使用其中一个实例.由于程序行为得以保留,没有人关心.
但是如果由于任何原因,包括使用预处理器,那些实例碰巧有不同的实现,链接器将再次选择其中一个函数,开发人员甚至不知道哪个被选中,直到他彻底测试他的程序.
当链接器选择其中一个函数并且碰巧有不同的实现分类后,后一种情况如何?这是未定义的行为还是其他任何情况?