问题 使用boost库时加快编译/链接时间


我在用着 提升计划选项使用它编译非常小的C ++代码需要相当长的时间(10秒甚至更长)。在没有boost库的情况下编译代码需要1秒钟。

知道如何使用boost库来增加编译/链接时间吗?它是跨平台的,所以我需要用Mac OS X / Linux / PC编译代码。


11011
2018-02-17 15:28


起源

boost的某些部分非常有用。许多组件虽然看起来过于工程化,并且只是因为它们仅在头文件中实现而得到了糟糕的头依赖项。所以你最终不必要地反复重新编译boost代码,而静态或共享库可以很好地完成。 - Maxim Egorushkin
几乎任何编译Boost足够现代的编译器也支持预编译头。这些在概念上相当于仅限标头库的静态库。 - MSalters
看这里, boost.org/boost-build2/doc/html/bbv2/reference/... - Dilawar


答案:


除了通常的技巧之外,你没有什么可以做的:

  • 最小化依赖性:仅引入您真正需要的Boost标头,并尽可能使用特定标头(许多库具有单个“主”标头,例如 boost/thread.hpp,但也是一个具有特定标题的子目录,如 boost/thread/shared_mutex.hpp
  • 在可能的情况下,依靠前向声明而不是包括整个标题,
  • 如果可能,请仅在a中包含标题 .cpp 文件。如果将其包含在标题中,则必须在每次编译包含该标题的转换单元时对其进行编译。作为一般经验法则,尽量减少标题中的代码量,
  • 所有主要编译器都支持预编译头。使用它们来减少编译时间,
  • 试验 团结一致。在您的情况下,这可能是也可能不是优势。

最后,但并非最不重要的是,最后一个选择就是不使用那些特定的Boost库。

我有时会在早期使用某些Boost库,出于方便,如果/当编译时间太糟糕时,我开始查看哪些库编译成本高昂,哪些库可以用相对简单的代码替换。通常情况下,Boost受到如此笼统的要求的阻碍。如果你不需要适用于8年编译器的东西,或者不需要在很多不同类型上工作的东西,那么你可以编写一个适合你的简单替换,并且几乎没有时间编译。


15
2018-02-17 15:34



你的意思是编译时间比重新实现几乎总是非常好的Boost库更有价值吗?如何购买好的CPU和SSD磁盘?另外,您对使用预编译头文件的建议平均减少了约80%的问题。我认为这几乎是你列出的最后一个,因为它并不是所有编译器都支持的,只有所有编译器都支持。 Boost Program Options 如果你的程序需要比“arg1 arg2”更复杂的输入,通常会使用它。在这种情况下,重新实现它将是非常耗时的选择。 - Andriy Tylychko
@Andy:不,我说的是 一 您可能会考虑的选项 一些 案例。 - jalf


我取得了很大的成功 编译器防火墙成语 减少编译时间。


1
2018-02-17 16:31



AKA Pimpl成语。当实现确实具有奇怪/异常/昂贵的依赖性时(例如,您不需要/想要在类的API中公开的第三方库),Pimpl非常好。但请记住,它确实会产生成本,无论是对于Pimpl实例的另一个(通常是动态分配的)类实例,还是代码的复杂性,因为类的大多数API将以某种方式转发到Pimpl类。 - Meros