为什么不是所有Boost库都只有标头?

时间:2012-07-06 13:21:48

标签: c++ boost

为什么Boost中的所有库都不是仅限标头? 换句话说,是什么使得.lib / .dll必须使用?

当一个类不能成为模板或具有静态字段时?

1 个答案:

答案 0 :(得分:30)

我猜不同点。

  • 二进制大小。标题只能给客户端带来规模负担吗?
  • 编译时间。仅头文件是否意味着编译性能显着下降?
  • 运行时性能。标题只能提供卓越的性能吗?
  • 限制。设计是否只需要标题?

关于二进制大小。

和一点安全性

如果boost库中有很多可访问的代码,或者编译器不能争论它是否可由客户端访问的代码,则必须将其放入最终的二进制文件中。 (*)

在具有包管理的操作系统上(例如基于RPM或.deb),共享库可能意味着二进制分发大小的大幅减少并具有安全优势:安全修复程序分发更快,然后由所有人自动使用.so / .DLL用户。所以你有一个重新编译和一个重新分配,但 N 奸商。使用仅限标头的库,您有 N 重新编译, N 重新分发,始终针对每个修复,并且 N 中的某些成员是巨大的他们自己已经。

(*)此处可达表示“可能已执行” 功能

关于编译时间。

一些提升库是巨大的。如果您#include全部,那么每次更改源文件中的位时,都必须重新编译#include d。

的所有内容。

这可以用樱桃挑选的标题进行反测量,例如

#include <boost/huge-boost-library.hpp> // < BAD
#include <boost/huge-boost-library/just-a-part-of-it.hpp> // < BETTER

但有时你真正需要包含的东西已经足够大,可能会削弱你的重新编译。

对策是使它成为一个静态或共享库,反过来意味着“完全编译一次(直到下一次提升更新)”。

关于运行时性能。

我们还处于一个时代,全局优化解决了我们所有的C ++性能问题。为了确保为编译器提供所需的所有信息,您可以只使用头文件,并让编译器做出内联决策。

在这方面,请注意,由于CPU上的缓存和推测问题,内联并不总能提供卓越的性能。

另请注意,此参数主要涉及可能经常使用的增强库,例如:人们可以期待boost::shared_ptr<>经常使用,因此是一个相关的表现因素。

但请考虑真实且唯一相关的原因boost::shared_ptr<>仅限标题...

关于限制。

C ++中的一些东西可以放入库中,即模板和枚举。

但请注意,这只是成功的一半。您可以将类型安全的模板化接口编写到您的实际数据结构和算法中,然后在库中进行运行时通用实现。

同样,C ++ 中的一些内容应放入源文件中,如果是boost,则放入库中。基本上,这就是会产生“多重定义”错误的一切,例如static成员变量或全局变量。

标准库中也可以找到一些示例:std::cout在标准中定义为extern ostream cout;,因此cout基本上需要分发某些内容(library或sourcefile)定义一次