我试图使用 SO 找到答案。有许多问题列出了在 C++ 中构建仅包含标头的库的各种优缺点,但我一直无法找到一个以可量化的方式这样做的问题。
那么,在可量化的方面,使用传统分离的 c++ 头文件和实现文件与仅使用头文件有什么不同?
为简单起见,我假设不使用模板(因为它们只需要标题)。
为了详细说明,我列出了我从文章中看到的优点和缺点。显然,有些是不容易量化的(比如易用性),因此对于量化比较是没有用的。我将用(可量化的)标记那些我期望可量化的指标。
仅标题的优点
- 它更容易包含,因为您不需要在构建系统中指定链接器选项。
- 您始终使用与其余代码相同的编译器(选项)编译所有库代码,因为库的函数已内联在您的代码中。
- 它可能会快很多。(可量化)
- 可能给编译器/链接器更好的优化机会(解释/量化,如果可能的话)
- 如果您仍然使用模板,则需要。
仅标头的缺点
- 它使代码膨胀。(可量化的)(这如何影响执行时间和内存占用)
- 更长的编译时间。(可量化)
- 失去接口和实现的分离。
- 有时会导致难以解决的循环依赖。
- 防止共享库/DLL 的二进制兼容性。
- 它可能会激怒喜欢使用 C++ 的传统方式的同事。
您可以从更大的开源项目(比较类似大小的代码库)中使用的任何示例将不胜感激。或者,如果您知道可以在仅标题版本和单独版本之间切换的项目(使用包含两者的第三个文件),那将是理想的。轶事数字也很有用,因为它们给了我一个大致的了解,我可以从中获得一些洞察力。
优点和缺点的来源:
提前致谢...
更新:
对于以后可能会阅读本文并有兴趣获得一些有关链接和编译的背景信息的人,我发现这些资源很有用:
- http://www.amazon.com/Computer-Systems-Programmers-Perspective-Edition/dp/0136108040第 7 章
- http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
- http://www.cyberciti.biz/tips/linux-shared-library-management.html
更新:(回应以下评论)
仅仅因为答案可能会有所不同,并不意味着测量是无用的。您必须从某个点开始测量。你的测量值越多,图片就越清晰。我在这个问题中要求的不是整个故事,而是图片的一瞥。当然,如果任何人想不道德地宣扬他们的偏见,他们都可以使用数字来歪曲一个论点。但是,如果有人对两个选项之间的差异感到好奇并发布了这些结果,我认为这些信息很有用。
没有人对这个话题感到好奇,足以衡量它吗?
我喜欢枪战项目。我们可以从删除大部分变量开始。仅在一种版本的 linux 上使用一种版本的 gcc。仅对所有基准测试使用相同的硬件。不要用多线程编译。
然后,我们可以测量:
- 可执行文件大小
- 运行
- 内存占用
- 编译时间(对于整个项目和通过更改一个文件)
- 链接时间