我有一个与 C++ 静态库和动态库相关的问题。假设现在您正在开发一个程序,并且可以在 C++ 库中找到一个功能。那么你有两种选择:一种是写一些代码(假设不要太多),然后重新实现功能;另一种是调用 C++ 库中的函数。但是,您要使用的 C++ 库是一个非常大的库,而您只使用了该库的一小部分。在这种情况下,什么是更好的选择?谢谢!
6 回答
静态库链接只会将您的可执行文件与您有效使用的符号链接起来。假设您在 lib 中有 200 个函数并且仅使用 4 个(包括 lib 的内部调用),那么只有您使用的 4 个符号将链接到可执行文件中。因此与 2Mb 库链接可能会导致您的可执行文件仅添加 20k。
windows下的动态库应该是符号完整的,即DLL将包含200个符号而您只需要4个。虽然它不会对您的可执行文件大小产生很大影响(因为用于与DLL链接的lib只是一个符号转发器),它可能会影响加载时间和内存占用。
我不知道,是否有人可以在这里给出“正确”的答案。我认为这更像是个人选择。
如果库真的很大并且我需要,比如说其中的 2-3 个函数,我会完全避免使用库并实现它们(或者复制实现,如果许可证允许的话)。
例如,有几次我需要一些函数来以某种方式解析字符串。Boost有这样的功能。但是我不想在我的项目中添加对 Boost 的依赖,只是因为 2-3 个函数,20-50 行代码。我只是自己重新实现了它们。
但是,正如我已经说过的,这更像是个人选择。或者取决于限制,如果你有的话。
编辑:注意:您不需要“重新发明轮子”。如果您需要这个库中的很多东西,请使用它!不要尝试实现已经存在的东西(因为它已经被其他用户测试和使用过)。特别是如果它很复杂。
使用该库,如果编译开销成为问题(对于大多数项目来说不是),那么重新实现它将是微不足道的。虽然现在您不必花时间编写额外的代码,但投入使用#include
会更快,更不用担心。
如果该库是一个已安装在您希望部署的系统上的共享库,那么使用它的开销很小——无论是在链接方面还是在运行时。
但是,如果需要部署有问题的库,静态链接的可能性可能值得研究。
任何一种情况都比编写自己的所用功能实现更可取。库版本已经过证明,而您的版本可能没有。
这是非常主观的,很多因素都起到了你没有记录的作用。比如:10 年后你还会支持这个项目吗?如今,在 C++ 代码中,这几乎是肯定的。很有可能您会后悔无法轻松跟上库的维护版本,复制/粘贴代码会变旧,如果您不仔细记录,总有一天谁接管维护肯定不会享受这一点你做了什么。
然后是过早的优化角度。在 Windows 上加载的可执行映像需要很少的资源。例如,一个“大型”库是 10 兆字节的代码。这是 32 位进程中虚拟内存地址空间的 0.5%。专注于virtual,您无需为不使用的代码付费。按需分页操作系统的一个非常好的好处。很难证明花费大量时间来破解库并记录您在这样做的可衡量收益很小的情况下所做的事情是合理的。只有您可以进行成本/收益分析。
如果该库的包含文件非常大,请使用前向声明。
如果链接是问题,请考虑共享库(也许只是为了开发)。
如果链接是问题并且这些功能很简单,也许可以考虑自己编写代码。
否则只能一击必杀。