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

Met*_*eta 31 compiler-construction 64-bit visual-studio-2010 visual-c++

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

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

jos*_*rry 25

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

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

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

您链接的页面说得很好:

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

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

感谢Brian R. Bondy的报价格式


Bri*_*ndy 11

从您链接的内容:

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

x64 on 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文件夹,您的注册表也将重定向到子节点.例如,当您尝试获取程序文件的文件夹时,c:\program files (x86)\如果您使用的是WOW64,它将返回,但c:\program files\如果您使用的是x64 ,它将返回.

另一个例子,对于注册表,如果你尝试写入HKLM\Software\Something它将真正重定向到你HKLM\SOFTWARE\Wow6432Node\Something没有你的x86程序的知识.

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

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