使用 VC++ 编译代码时,MSDN 为您提供使用 x86_amd64 工具集或 amd64 工具集(调用 vcvarsall.bat 时)之间的选项。
编译 x64 代码时如何在这两者之间进行选择? amd64 选项会生成比交叉编译器更高效的 x64 机器代码吗?
与效率无关。本机编译器和交叉编译器都将生成相同的机器代码。然而,通过在 64 位工作站上运行本机 64 位编译器进程(更大的寄存器、更大的内存空间等),您将获得一些好处。
本机编译器只能在 64 位 Windows 副本上运行,因此如果您的工作站是 32 位,则该编译器甚至无法运行。
交叉编译器旨在在 x86 机器上运行,尽管它将通过 WoW 在 64 位 Windows 副本上运行;然而,没有理由这样做。
您链接的页面说得很好:
x86 上的 x64(x64 交叉编译器)
允许 您可以为 x64 创建输出文件。 此版本的 cl.exe 作为 32 位进程,x86 上的本机 机器和 64 位 WOW64 下 Widows操作系统。x64 上的 x64
允许您创建输出 x64 的文件。此版本的 cl.exe 作为 x64 上的本机进程运行 机器。感谢 Brian R. Bondy 提供报价格式
来自您链接的内容:
x86 上的 x64(x64 交叉编译器)
允许 您可以为 x64 创建输出文件。 此版本的 cl.exe 作为 32 位进程,x86 上的本机 机器和 64 位 WOW64 下 Widows操作系统。x64 上的 x64
允许您创建输出 x64 的文件。此版本的 cl.exe 作为 x64 上的本机进程运行 机器。
转述:
如果您使用 x86_amd64,那么您通常在 x86 计算机上进行开发,并且希望创建在 x64 上本机运行的 x64 文件。 您也可以在 x64 机器上使用此选项,但您的编译器将在 WOW64 模拟下运行。
如果您使用 AMD64,那么您正在 x64 计算机上进行开发,并且您想要创建在 x64 上本机运行的 x64 文件。 编译器在 x64 中本机运行。 此选项构建 x64 程序的效率更高。
您可能想知道为什么要在 x86 计算机上开发 x64 程序,因为您无法运行它,也无法调试它。 好吧,例如,如果您有一个 x86 的构建服务器并且该构建服务器需要生成 x86 和 x64 输出,那么它仍然很有用。
如果是基于x86的程序(x86_amd64),编译器怎么可能在x64下运行? 这与您可以在 x64 计算机上运行任何 x86 程序的原因相同...感谢 WOW64 模拟。
什么是WOW64仿真:
当您在 x64 计算机(或 IA64)上运行 x86 程序时,会发生 WOW64 模拟。 WOW64 代表 Windows 32 on Windows 64。它是 x64 计算机之上的模拟层,允许您执行 x86 程序。您的文件系统操作将被重定向到WOW64文件夹,您的注册表也将被重定向到子节点。 例如,当您尝试获取程序文件的文件夹时,如果您使用的是 WOW64,它将返回
c:\program files (x86)\
,但如果您使用的是 x64,它将返回
c:\program files\
。另一个例子,对于注册表,如果您尝试写入
HKLM\Software\Something
,它实际上会将您重定向到
HKLM\SOFTWARE\Wow6432Node\Something
,而您的 x86 程序并不知情。运行本机 x64 构建将比通过 WOW64 模拟运行更高效,为什么?因为您没有额外的模拟层将 32 位调用转换为 64 位调用。
顺便说一下,如果您运行的是 x64 版本的 Windows,您可以通过 WOW64 查看哪些进程正在运行,因为它们在进程列表中的进程名称后会附加一个 *32。