繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM