为什么Boost中的所有库都不是仅限标头? 换句话说,是什么使得.lib / .dll必须使用?
当一个类不能成为模板或具有静态字段时?
答案 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)定义一次。。