编译x64代码时,“x86_amd64”和“amd64”之间有什么区别?

时间:2010-08-18 01:01:11

标签: visual-c++ visual-studio-2010 compiler-construction 64-bit

使用VC ++编译代码时,MSDN为您提供了使用x86_amd64工具集或amd64工具集(调用vcvarsall.bat时)的选项。

编译x64代码时如何在这两者之间做出选择? amd64选项是否会产生比交叉编译器更高效的x64机器代码?

2 个答案:

答案 0 :(得分:22)

它与效率无关。本机和交叉编译器都将生成相同的机器代码。但是,通过在64位工作站上运行本机64位编译器进程(更大的寄存器,更大的内存空间等等),您将获得一些好处。

本机编译器只能在64位的Windows副本上运行,因此如果您的工作站是32位,则此编译器甚至不会运行。

交叉编译器意味着在x86机器上运行,即使它将通过WoW在64位Windows副本上运行;但是,没有理由这样做。

您链接的页面说得很好:

  x86上的

x64(x64交叉编译器)
  允许   您要为x64创建输出文件。   此版本的cl.exe运行为   32位进程,本机在x86上   机器和WOW64下的64位   寡妇操作系统。

     

x64 x64
  允许您创建输出   x64的文件。此版本的cl.exe   在x64上作为本机进程运行   机。

     

感谢Brian R. Bondy报价格式

答案 1 :(得分:9)

来自您的链接:

  x86上的

x64(x64交叉编译器)
  允许   您要为x64创建输出文件。   此版本的cl.exe运行为   32位进程,本机在x86上   机器和WOW64下的64位   寡妇操作系统。

     

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 64上的Windows 32.它是x64机器上的仿真层,允许您执行x86程序。

您的文件系统操作将重定向到WOW64文件夹,您的注册表也将重定向到子节点。例如,当您尝试获取程序文件的文件夹时,如果您使用的是WOW64,它将返回c:\program files (x86)\,但如果您使用的是x64,它将返回c:\program files\

另一个例子,对于注册表,如果您尝试写入HKLM\Software\Something,它会在没有您的x86程序知识的情况下将您重定向到HKLM\SOFTWARE\Wow6432Node\Something

运行本机x64构建比运行WOW64仿真更有效为什么?因为您没有额外的仿真层将32位调用转换为64位调用。

顺便说一下,如果您运行的是x64版本的Windows,您可以看到哪些进程正在通过WOW64运行,因为它们会在进程列表中的进程名称后附加* 32。