我有一个在VS2008下编译的相当大的C ++程序(~11mb exe),并且有兴趣看看整个程序优化是否会显着影响其性能。但是,打开整个程序优化和链接时间代码生成会导致链接失败,如下所示;
1>c:\cpp\Win32\Atlas\tin\TINDoc.Cpp : fatal error C1083: Cannot open compiler intermediate file: '.\releaseopt\TINDoc.obj': Not enough space
1>LINK : fatal error LNK1257: code generation failed
查看任务管理器,我可以看到链接器使用越来越多的内存,直到它耗尽并炸弹。编译器在XP 32bit上运行,带有2GB或ram和2gb页面文件。 WPO仅限于较小的应用程序和/或更大的环境,还是有任何方法可以让链接器在内存使用方面更加节俭。
n.b。已经转换了预编译的头文件,这导致编译在链接之前失败,并关闭了调试信息的输出以及可能需要额外资源的任何其他内容。 C1083的帮助表明缺少头文件或文件句柄不足而不是空间不足。
编辑:在VS2010下工作,虽然没有预编译的标头,但性能提升并不那么重要。我将单独留下这个选项,直到我使用更强大的VS2010版本进入更强大的64位平台。
答案 0 :(得分:5)
“不工作”的例子包括
实际上,如果你看一下现代优化器使用的一些技巧,它的工作频率和它一样频繁。复杂性非常惊人。
特别针对Shane的问题,可能会导致错误的一些事情:
在DOS和早期Windows版本中,用完文件句柄曾经是一个大问题。在现代Windows版本中你几乎没有看到它。我甚至不确定文件句柄是否仍有限制。
编译器错误可能是无限循环,这意味着没有足够的资源。
递归包含文件也可能导致类似的情况。您的所有包含文件都包含“#pragma once
”或“#if !defined(FOO_INCLUDED)
”吗?
您是否有可能在项目中包含文件TINDoc.obj两次? 2008编译器是多线程的,并且在尝试访问该文件的两个线程之间可能存在争用。实际上,这可能是通过编译器错误发生的,即使您没有包含该文件两次。
如果程序真的 太大,请考虑将其分解为一个或多个DLL并逐步构建,或者将争议源文件分成多个文件到多个阶段的编译器。
不要认为,因为它说“没有足够的空间”必须是原因。某些程序(包括一些编译器)会猜测出错的原因,而不是检查。
您可以使用任务管理器或perfmon监控内存,句柄等的使用,或(我的偏好)Process Explorer
我已将这一部分的第一部分作为评论(上图)发布,但正如Ben(http://stackoverflow.com/users/587803/ben)所建议的那样,我将其作为答案 - 并且有点扩大了。
答案 1 :(得分:3)
您可以尝试使用/3G开关启动XP,为链接器提供3GB的地址空间。在Vista / 7中,在命令行中使用BCDEDIT /Set IncreaseUserVa 3072
以获得相同的效果。
这解决了为我创建.ilk文件的问题。