gpt4 book ai didi

c++ - Visual C++ 10(又名 2010)与 Visual C++ 9(又名 2008)相比

转载 作者:行者123 更新时间:2023-11-30 18:23:05 27 4
gpt4 key购买 nike

是否有在线资源描述 VC10 与 VC9 相比代码生成的变化?

我不是在谈论 c++0x 和其他不错的功能(例如内置 static_assert),也不是在谈论精致的 UI。我需要知道的是,由于优化、结构成员对齐方式的变化等,生成的代码预计会有何不同。

附注这是一个 MSVC 2010 Express,适用于 Win32

编辑

我已经使用VC10构建了几个项目,所以现在我有一些比较数据。总体而言,我发现可执行镜像大小显着增加,与 VC9 相比大约增加了 15%,甚至与 VC8 相比增加了 10%。

我正在优化速度,而不是图像大小。所以严格来说这种比较是不公平的。不过我记得,与 VC8 相比,VC9 通常生成的图像要小一些,但能够压缩更多的性能。从性能的角度来看,新代码非常接近 VC9(在我的测试中无法区分)。

除了代码质量下降(我希望情况并非如此)之外,我还发现了较大图像的以下潜在原因:

  • 更积极的整体速度优化(至少在我的情况下,效果有限),例如积极的循环展开等。
  • 由于一些新功能(例如 SAFESEH、DEP 等),图像中出现了额外的数据
  • 出于某种原因需要更大的运行时库(我将它们用作静态库,链接到可执行文件中)

禁用 SAFESEH 选项(现在默认启用)会稍微降低图像质量 (1%)。

还有更多想法吗?如果我使用非 Express 版本的 VC10,情况会有所不同吗?启用DEP(数据执行阻止)是否会放大图像尺寸? (我猜 - 不)

我使用/EHa 进行编译,这会降低优化强度,但旧的 VC 版本也是如此。

编辑2

我找到了图像膨胀的原因。

使用dumpbin我发现令人惊讶的是VC10构建的EXE包含一个重定位表。这很奇怪,因为 EXE 通常不包含它。如果 EXE 是使用 vcxproj 文件中的以下内容构建的,则它会消失:

<Link>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
</Link>

默认情况下,VC10 中的基地址随机化处于打开状态。这个选项神秘地使 VC10 的链接器表现得“就像构建 DLL 一样”,因此它包含了重定位表。

这减少了 EXE 的大小,但仍然没有达到 VC9 的水平。然后我用dependency walker打开EXE,发现VC10构建的EXE从kernel32.dll导入了EncodePointerDecodePointer

根据在线资源,这些函数是由 VC10 运行时库导入的,这是另一个增强软件“安全性”的白痴天真的尝试。不仅新的运行时看起来更胖,而且这还会阻止可执行文件在 Win2K 和 WinXP-SP1 下运行。

幸运的是,有一个选项可以回退到旧的运行时库:

<PlatformToolset>v90</PlatformToolset>

设置完成后,生成的 EXE 几乎与 VC9 生成的 EXE 完全相同,包括大小、导入表、节、安全异常处理表、资源等。

因此现在可以从一些新功能中受益,而无需牺牲代码质量。

最佳答案

查看这些概述 Visual Studio C++ 2010 中的更改的 MSDN 文章:

关于c++ - Visual C++ 10(又名 2010)与 Visual C++ 9(又名 2008)相比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9345078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com