Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在VS中构建增强型解决方案_C++_Visual Studio_Visual C++_Boost_Build Process - Fatal编程技术网

C++ 在VS中构建增强型解决方案

C++ 在VS中构建增强型解决方案,c++,visual-studio,visual-c++,boost,build-process,C++,Visual Studio,Visual C++,Boost,Build Process,Boost rocks,它非常强大,但我讨厌每次在Visual Studio 7.1中构建解决方案时都使用它 这似乎对构建时间有影响(不是积极的)。我不能从我的项目中删除所有的Boost用法来比较构建时间,但我在小项目中尝试过,这种差异是有意义的 我想问题在于Boost由数千个头文件组成,这些头文件包含了大量的头文件。因此,当我在头文件中包括(比如)boost/function.hpp时,可能会导致包含数百个boost头文件 有没有人有过同样的经历?有什么办法解决吗 粗略的想法: 向预编译头添加

Boost rocks,它非常强大,但我讨厌每次在Visual Studio 7.1中构建解决方案时都使用它

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

我想问题在于Boost由数千个头文件组成,这些头文件包含了大量的头文件。因此,当我在头文件中包括(比如)boost/function.hpp时,可能会导致包含数百个boost头文件

有没有人有过同样的经历?有什么办法解决吗

粗略的想法:

  • 向预编译头添加boost?至少它们将被解析并保存在一个文件中
  • 对某些Boost模板执行显式实例化吗
  • 准备好了吗
  • 不包括Boost到头文件(听起来不真实)

  • 是的,Boost还使用了硬核模板,我想这对编译器来说相当困难,所以数千个头文件不是唯一的问题。

    正如您在文章中提到的,Boost代码包含大量模板代码,需要大量CPU周期来编译。与此相比,来自多个头文件的开销非常小

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

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

    • 清理不必要的include语句(尤指标题中的)
    • 在头文件中,将包含替换为转发声明(如果可能)
    • 得到一台更快的计算机:D

    只有在确实需要的时候才包含Boost头文件才有意义。包括其他头文件在内的头文件会给IO带来压力,并对编译时间有很大影响。远期申报在某种程度上是有帮助的,但若有提振,这可能是真正的痛苦

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

    #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
    #   include <boost/shared_ptr.hpp>
    #endif
    
    \ifndef增压\u共享\u PTR\u水电站\u包括在内
    #包括
    #恩迪夫
    

    避免头级联的另一种方法是使用,特别是在处理复杂类时。然后,复杂的Boost内容可以被包含并仅由该编译单元使用。缺点是接口的设计应该不需要特定于Boost的东西。然而,打破依赖关系也可能是一件好事

    我也很喜欢

    • 如您所说的那样使用预编译头(这会带来更多)
    • 使用链接库时,请检查是否确实需要它们(链接速度也很慢)
    另一个可能是愚蠢的提示,但却是我的电脑性能下降的主要原因:

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

    当然,包含boost会导致更长的编译时间,就像包含任何库一样。由于所有逻辑都是在头文件中实现的,因此(大部分情况下)作为一个模板库会导致相当大的性能损失

  • 我已经有了很好的结果,包括预编译头中的(一个子集)boost。然而,我相信MSVC 9的收益最大。在MSVC 7上,我看到过一些报告说,模板的预编译头经常导致性能下降。另一个决定性能是否会提高的关键方面是在预编译头中包含appropiate头。只包含您经常使用的标题,并确保它们从未更改(也就是说,在这里包含您自己的标题之前,请考虑三次)

  • 我不知道显式实例化是否有任何效果,尽管我对此表示怀疑。如果有人看到过这方面的任何结果(不管编译器如何),那将是非常有趣的

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

  • 可能不像你想象的那么不真实。始终尽可能多地使用,以减少每个头文件的“占用空间”。考虑使用该模式避免包含未在您的类的公共接口中反映的Boost头(异常:我认为PIML常常是不必要的。相反,我尝试将类分成更小的部分,以“更干净”的方式获得相同的结果)。只要您在使用这些类时保持一致(如果您在所有类中都使用它们,那么将它们隐藏在一个标题中不会有多大好处),就不要害怕包括通用类和公共类(例如共享类)

  • 升级MSVC(以支持并行构建)将有所帮助。然而,这一直是C++中的一个问题。为了最大限度地减少问题,您需要非常严格并遵循准则来减少标题的占用空间。你应该不时地检查一下include条款,确保没有不必要的内容。如果你在标题中完成的包含列表越来越长,你可能做错了什么-大多数包含应该只在cpp中


  • 竖起拇指寻找防病毒提示!它们通常比病毒造成的危害更大。我以前遇到过反病毒软件。反病毒软件的优点是,但它已经被禁用用于构建目录。我们还为项目文件和输出使用单独的HDD。这很有帮助,似乎对我不起作用。我们已经使用了非常快速的计算