[英]Why are not all Boost libraries header-only?
为什么Boost中的所有库都不都是仅标头的? 换句话说,什么使强制使用.lib / .dll?
是当类不能作为模板或具有静态字段时吗?
我猜是不同的观点。
和一点安全
如果boost库中有很多可访问的代码,或者编译器无法争论客户端是否可以访问的代码,则必须将其放入最终二进制文件中。 (*)
在具有程序包管理的操作系统(例如,基于RPM或.deb的操作系统)上,共享库可能意味着二进制分发大小会大大减少并且具有安全优势:安全修补程序分发速度更快,然后所有.so /会自动使用。 .DLL用户。 因此,您进行了一次重新编译和一次重新分配,但是您获得了N个获利者。 使用仅标头的库,您总是为每个修复程序进行N次重新编译, N次重新分发,并且其中N个成员中的某些成员本身已经非常庞大。
(*)此处的含义是“潜在执行”
一些Boost库很大。 如果要全部包含#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库,例如,人们可能期望boost::shared_ptr<>
非常频繁地使用,因此是一个相关的性能因素。
但是请考虑boost::shared_ptr<>
的真正且唯一相关的原因是仅标头...
C ++中的某些内容无法放入库中,即模板和枚举。
但是请注意,这只是一半。 您可以为实际的数据结构和算法编写类型安全的模板化接口,这些接口又在库中具有运行时通用的实现。
同样, 应将 C ++中的某些内容放到源文件中,如果使用boost, 应放到库中。 基本上,这就是会产生“多个定义”错误的所有内容,例如static
成员变量或全局变量。
在标准库中也可以找到一些示例: std::cout
在标准中定义为extern ostream cout;
等cout
基本上需要的东西 (库或的资源文件)的分布,它定义了一次,只有一次 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.