发布网友 发布时间:2022-06-14 19:51
共4个回答
热心网友 时间:2023-10-20 19:26
意思是:热心网友 时间:2023-10-20 19:26
本文由Mark Hall,Xiang Fan,Yuriy Solodkyy,Bat-Ulzii Luvsanbat和Andrew Pardoe 撰写。
预编译头可以显着缩短编译时间。自25年前推出以来,它们为数百万开发人员提供了可靠的工作,以加快MFC应用程序的构建。预编译头文件被广泛使用:默认情况下,它们在IDE中创建的新Visual C ++项目中启用,同样在我们的intellisense体系结构中提供了实质性的性能提升。
预编译头如何加速构建?对于给定项目,大多数源文件共享一组通用的头文件(尤其是为Windows构建的软件)。其中许多头文件不经常更改。预编译头允许编译器将编译一组头的结果保存到PCH文件中,该文件可用于代替后续编译中的头文件。如果您想了解更多信息,本文档将讨论预编译头文件的优点以及如何在项目中使用它们。
预编译的头文件可以很好地用作“设置并忘记它”吗?特征。例如,在升级编译器时很少需要注意。然而,由于它们的性质,在极少数情况下会出现问题,并且很难弄清楚原因。本文将帮助您了解客户在使用Visual C ++编译器预编译头文件时遇到的一些最新问题。
概观
在使用MSVC编译器创建或使用PCH文件时,您可能会看到使用这些错误代码和消息的间歇性构建失败:
致命错误C3859:超出PCH的虚拟内存范围; 请使用'-ZmXXX'或更高版本的命令行选项重新编译
致命错误C1076:编译器*:达到内部堆; 使用/ Zm指定更高的*
致命错误C1083:无法打开包含文件:'xyzzy':没有这样的文件或目录
编译器可能因这些诊断失败的原因有很多。所有这些失败都是虚拟内存空间中某种内存压力的结果,当编译器试图为特定虚拟内存地址的PCH文件保留和分配空间时,会出现这种压力。
如果您遇到PCH文件错误,您可以做的最好的事情之一就是转移到更新的Visual C ++编译器。我们在VS 2015和VS 2017中修复了许多PCH内存压力错误.Visual Studio 2017包含VS 2015.3的编译器工具集以及VS 2017的工具集,因此它是Visual Studio 2017的简单迁移路径。2017版15.3中提供的编译器提供了改进的诊断功能,可帮助您了解遇到这些间歇性故障时发生的情况。
即使使用最新的编译器,随着开发人员开始构建具有大量物理内核的计算机,在使用PCH文件时,他们仍然会遇到从操作系统提交内存的偶然故障。随着PCH文件大小的增加,优化构建的稳健性和构建速度非常重要。使用64位托管编译器可以帮助,以及使用/MP编译器开关和MSBuild的/maxcpucount:开关调整并发编译的数量。
影响PCH内存问题的领域
与PCH使用相关的构建失败通常具有以下原因之一:
在CL.EXE能够将其加载到内存之前,PCH所需的虚拟内存地址范围的碎片。
重负载下Windows操作系统无法在特定时间阈值内增加页面文件大小。
无法自动增加页面文件大小
一些使用多核(32+)计算机的开发人员报告说,在高度并行构建过程中会看到上述间歇性错误消息,并且有几十个CL.EXE进程处于活动状态。将MSBUILD.EXE 的/maxcpucount(/m)选项与/MPCL.EXE选项结合使用时,更有可能发生这种情况。同时使用的这两个选项可以将一次运行的CL.EXE进程的数量相乘。
潜在的问题是Windows正在调查的潜在文件系统瓶颈。在极端资源争用的某些情况下,即使有足够的磁盘空间,操作系统也无法增加虚拟内存页面文件的大小。这种资源争用可以在高度并行化的构建场景中实现,其中许多CL.EXE进程同时运行。如果正在使用PCH,则每个CL.EXE进程将进行多次调用VirtualAlloc(),要求它提交大量虚拟内存以加载PCH组件。如果系统页面文件正在自动管理,则操作系统可能会超时,然后才能为所有VirtualAlloc()呼叫提供服务。如果在此方案中看到上述错误消息,则手动管理页面文件设置可能会解决问题。
网页链接这篇博客或许能解决,反正我改了也是不行,最后就换成2017,可以了
热心网友 时间:2023-10-20 19:26
在编译的设置里面,编译选项后加入 /Zm1000或者/Zm2000,确定热心网友 时间:2023-10-20 19:27
内部的“堆”到达了极限。用/zm来个更高的极限。。。具体是什么问题就不知道了