使 Visual Studio 2010 能够使用超过 2GB 的 RAM 意味着啥?
Posted
技术标签:
【中文标题】使 Visual Studio 2010 能够使用超过 2GB 的 RAM 意味着啥?【英文标题】:What are the implications of making Visual Studio 2010 able to use more than 2GB of RAM?使 Visual Studio 2010 能够使用超过 2GB 的 RAM 意味着什么? 【发布时间】:2013-05-29 23:04:05 【问题描述】:好的,我在 Internet 上找到了 this 指南和其他一些建议,它们建议使用 Visual Studio 命令提示符从 VS 2010 IDE 目录运行以下命令:
editbin /largeaddressaware devenv.exe
我已经运行了这个程序,到目前为止,似乎一切正常(我还没有遇到任何问题)。但是我找不到关于使 Visual Studio 2010 使用超过 2GB 的 RAM 的负面影响(如果有的话)的信息吗? Visual Studio 被构建为使用最大 2 GB 的 RAM。如果 VS 打算使用超过 2 GB 的 RAM,那么我就不必破解二进制文件了。虽然我喜欢坐在裤子座位上飞行并尝试新事物而不为最坏的情况做准备(这就是我所擅长的,哈哈),但我至少想知道我应该准备好应对什么问题出错了。
TL;DR;:如果有的话,使用上面的“editbin”命令让 Visual Studio 2010 知道大于 2 GB 的内存地址有什么负面影响?
【问题讨论】:
启用它可能不会使 Visual Studio 运行得更快。如果 Visual Studio 的地址空间不足,它会崩溃或发出内存不足的警告。如果 Visual Studio 没有耗尽内存,那么这可能不会起到任何积极作用 您从未提及您是在 32 位还是 64 位 Windows 上运行,或者您是否使用了 /3GB 开关。 不要害怕,这是完全安全的。该选项已打开。 @shf301:我确实注意到构建时间减少了很多,而且我的内存使用量现在超过了 250000KB,而不是之前使用的 150000KB。我很好奇为什么,因为我验证了未修改的 devenv.exe 已经启用了此选项 @RobertHarvey:对不起,我使用的是 Win7 Ultimate 64 位和 VS 2010 Premium 【参考方案1】:启用 largeaddressaware 的负面影响是应用程序可能会以奇怪的方式崩溃或损坏内存。该程序是假设它必须处理的指针值不会大于 2GB 的情况下编写的。这可以通过微妙的方式来完成。典型的例子可能是计算指针之间的中点地址。
ptrMid = (ptr1 + pt2) / 2;
如果您的所有指针都小于 2GB,这将非常有用,但如果不是,您将由于溢出而得到不正确的结果。
ptrMid = (0x80000000 + 0x80000004) / 2 = 0x0000002, not 0x80000002
您不仅需要担心 Visual Studio 无法处理 > 2GB 的指针,任何加载项也会受到此影响。
有关在启用 largeaddressaware 之前必须检查的更多内容,请参阅此问题,请参阅此问题:What to do to make application Large Address Aware?
您真的不应该使用 editbin 来更改您无法控制的应用程序上的 largeaddressaware。
【讨论】:
【参考方案2】:阅读此discussion 并检查现有标题后,看起来 VS2010 已经应用了此功能,至少对于我的安装来说(64 位 win7)。如果它已经编译了,我认为您不必担心不良的副作用。
【讨论】:
嗯,它做了一些事情,因为之前 VS 使用了大约 150000 KB 或内存,现在它使用了大约 375000,我的构建时间减少了大约 25% 这是正确答案,选项已经开启。至少从VS2008开始,可能之前。在 devenv.exe 上运行 dumpbin.exe /headers 以查看此内容。嗯,未修改的版本。 这很有趣。我刚刚使用未修改的 devenv.exe 检查了另一台机器上的标头,并且确实该应用程序已经打开了该选项。但是我确实在运行 editbin /largeaddressaware 命令之前和之后检查了我的构建时间和内存使用情况,并且性能/内存使用情况明显增加。我想知道 editbin 命令是否对默认情况下未附带 devenv.exe 的可执行文件执行某些操作? 另外,在 devenv.exe 上运行 editbin 后,对我在此处的第一条评论进行更正(此时不允许我编辑),内存使用量平均上升到 275000,而不是 375000 【参考方案3】:这似乎是设计使然。
回想一下,即使设置了 /3GB 开关,32 位程序也会收到 只有 2GB 的地址空间,除非他们表示愿意 通过传递 /LARGEADDRESSAWARE 标志来处理超过 2GB 的地址。
此标志在 64 位 Windows 上的含义相同。但由于 64 位 Windows 有更大的可用地址空间,它可以负担得起 给 32 位 Windows 程序整个 4GB 的地址空间 采用。这在Knowledge Base article Q889654 表“内存和 CPU 限制的比较”中几乎是偶然提到的。 32 位和 64 位版本的 Windows”。
换句话说,某些类别的 32 位程序(即那些 地址空间紧张)受益于在 64 位 Windows 上运行 机器,即使他们没有明确利用任何 64 位功能。
http://blogs.msdn.com/b/oldnewthing/archive/2005/06/01/423817.aspx
Editbin 是 Microsoft 实用程序,因此他们基本上声称它可以工作。
【讨论】:
非常正确。我确实阅读了有关该命令的 MSDN 页面,但该实用程序的文档似乎很少。你链接的文章在我搜索谷歌时甚至都没有出现,也许我刚刚开始变老,我什至无法正确搜索互联网哈哈 澄清一下:我认为微软没有声称如果使用 Editbin(或任何此类工具)修改 VS 将起作用;声称 Editbin 有效。另请注意,VS2010 EULA 第 9 节(标题为“许可范围”)指出“您不得:解决软件中的任何技术限制;”。 @Jimmy:是的,我同意您对 Editbin 及其认可用途的评估。您从许可证中提取的条款旨在防止诸如入侵 Visual Studio Express 之类的事情,以便它接受插件(在 Express 版本中被阻止的功能)。 Editbin 是专门为执行此 hack 而设计的,因此 Microsoft 似乎不太可能不希望您将其用于此目的。以上是关于使 Visual Studio 2010 能够使用超过 2GB 的 RAM 意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2010 DTE:如何使添加的 DLL 引用成为绝对引用而不是复制
如何使 armadillo-5.200.1(+openblas 或 lapacke)与 Visual Studio 2010 一起工作?
如何使 Visual Studio C++ 2010 编译行为像 gcc/g++? (或相反亦然)