在VS中构建基于Boost的解决方案

时间:2009-09-08 21:21:49

标签: c++ visual-studio visual-c++ boost build-process

提升岩石,它非常强大,但我每次在Visual Studio 7.1中构建解决方案时都讨厌它。

Boost似乎对构建时间有影响(不是积极的)。我不能从我的项目中删除所有Boost用法来比较构建时间,但我在小项目上尝试过它,差异很有意义。

我想问题是Boost包含数千个头文件,这些头文件非常广泛地包含在内。因此,当我将boost/function.hpp包含在我的头文件中时,可能会导致包含数百个Boost标头。

是否有人经历过同样的事情?任何想法如何解决?

粗略的想法:

  1. 为预编译标头添加提升功能?至少它们将被解析并保存在一个文件中
  2. 对某些Boost模板进行显式即时化吗?
  3. 以某种方式准备Boost标题?
  4. 不要将Boost包含在头文件中(听起来不真实)
  5. ...
  6. PS。是的,Boost也使用了我认为很难编译的硬核模板,因此成千上万的头文件不是唯一的问题。

4 个答案:

答案 0 :(得分:8)

我也喜欢提升很多

  • 使用预编译的标题,就像你告诉的那样(带来最多)
  • 使用链接库时,请检查是否确实需要它们(链接也很慢)

另一个可能是愚蠢的提示,但却是我计算机上性能损失的主要来源:

  • 检查您的防病毒软件是否进行了按访问扫描,并将其禁用为标题&源目录(boost和您的项目)

答案 1 :(得分:2)

当然,包括提升会导致更长的编辑时间 - 就像包括任何库一样。由于所有逻辑都在头文件中实现,因此(大多数情况下)模板库的外观导致相当大的性能损失。

  1. 我已经有了很好的结果,包括预编译头文件中的(一部分)提升。但是,我相信MSVC 9的增益最大。在MSVC 7上,我看到几个报告说模板的预编译头经常导致性能下降。确定您是否会看到性能提升的另一个关键方面是在预编译头中包含适当的头。只包含您经常使用的标题,并确保它们永远不会更改(也就是说,在此处包含您自己的标题之前要三思考)

  2. 我不知道明确的即时化是否有任何影响,即使我对此表示怀疑。如果有人看到任何结果(无论编译器),那将非常有趣。

  3. “准备”提升标题听起来像改变它们,这听起来对我来说是一个非常糟糕的主意。您不希望最终维护自定义标头...

  4. 可能不像你想象的那么不真实。始终使用尽可能多的forward declarations来减少每个头文件的“占用空间”。考虑使用Pimpl模式来避免包含未在类的公共接口中反映的boost头(offtopic:我认为Pimpl通常是不必要的。相反,我尝试将类切成小块,实现相同的导致“更清洁”的方式。只要你在这些类的使用中保持一致,就不要害怕包含一般的普通类(例如shared_ptr)(如果你在所有类中使用它们,你将看不到将它们从一个标题中隐藏起来有很多好处)

  5. 升级MSVC(支持并行构建)会有所帮助。但是,这在C ++中始终是一个问题。为了最大限度地减少问题,您需要非常严格并遵循指导原则来减少标题的占用空间。您应该查看include子句,并确保没有必要包含任何内容。如果你在标题中完成的包含列表越来越长,你可能做错了 - 大多数包括在cpp中。

答案 2 :(得分:0)

正如您在帖子中提到的,boost代码包含许多模板代码,需要大量的CPU周期才能进行编译。与此相比,多个头文件的开销非常小。

您需要做的第一件事是找出哪个头文件或哪行代码导致编译延迟。通常不是包含头文件,而是在您自己的代码中使用其中一个类/函数导致延迟。您可以通过注释掉代码片段来隔离负责的代码,直到编译再次快速,然后取消注释您的代码片段,直到编译再次变慢。然后你可以决定是否要用其他东西替换慢速代码。这取决于你在这里权衡利弊或编译速度与漂亮的增强代码。

您还可以做其他一些事情:

  • 清理不需要的包含语句,esp在标题中
  • 在您的头文件中
  • ,使用前向声明(如果可能)替换包含
  • 获得更快的电脑:D

答案 3 :(得分:0)

只有在真正需要时才包含Boost头文件才有意义。包括其他标头在内的标头会对IO造成压力,并对编译时间产生很大影响。前向声明对某些方面有帮助,但对于Boost来说,它可能是真正的痛苦。

在头文件中使用外部防护可以避免不必要的加载。像这样:

#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
#   include <boost/shared_ptr.hpp>
#endif

避免标题级联的另一种方法是使用"pimpl"-idiom,尤其是在处理复杂类时。然后可以包含复杂的Boost内容并仅由该编译单元使用。缺点是界面应该设计成不需要Boost特定的东西。但是,打破依赖关系可能也是一件好事。