本人在构建boost的时候,从"Start Menu" -> "Programs" -> "Visual Studio 2015" -> "Visual Studio Tools" -> "Windows Desktop Command Prompts":
VS2015 x64 ARM Cross Tools Command Prompt.lnk
VS2015 x64 Native Tools Command Prompt.lnk
VS2015 x64 x86 Cross Tools Command Prompt.lnk
VS2015 x86 ARM Cross Tools Command Prompt.lnk
VS2015 x86 Native Tools Command Prompt.lnk
VS2015 x86 x64 Cross Tools Command Prompt.lnk
开始郁闷于
VS2015 x64 Native Tools Command Prompt.lnk
VS2015 x64 x86 Cross Tools Command Prompt.lnk
此两者的区别。
区别在这里
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64
%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64_x86
而vcvarsall.bat内容如下
@echo off
if "%1" == "" goto x86
if "%2" == "" goto check_platform
if not "%2" == "store" goto usage
:check_platform
if /i %1 == x86 goto x86
if /i %1 == amd64 goto amd64
if /i %1 == x64 goto amd64
if /i %1 == arm goto arm
if /i %1 == x86_arm goto x86_arm
if /i %1 == x86_amd64 goto x86_amd64
if /i %1 == amd64_x86 goto amd64_x86
if /i %1 == amd64_arm goto amd64_arm
goto usage
:x86
if not exist "%~dp0bin\vcvars32.bat" goto missing
call "%~dp0bin\vcvars32.bat" %2
goto :SetVisualStudioVersion
:amd64
if not exist "%~dp0bin\amd64\vcvars64.bat" goto missing
call "%~dp0bin\amd64\vcvars64.bat" %2
goto :SetVisualStudioVersion
:arm
if not exist "%~dp0bin\arm\vcvarsarm.bat" goto missing
call "%~dp0bin\arm\vcvarsarm.bat" %2
goto :SetVisualStudioVersion
:x86_amd64
if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
goto :SetVisualStudioVersion
:x86_arm
if not exist "%~dp0bin\x86_arm\vcvarsx86_arm.bat" goto missing
call "%~dp0bin\x86_arm\vcvarsx86_arm.bat" %2
goto :SetVisualStudioVersion
:amd64_x86
if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
goto :SetVisualStudioVersion
:amd64_arm
if not exist "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" goto missing
call "%~dp0bin\amd64_arm\vcvarsamd64_arm.bat" %2
goto :SetVisualStudioVersion
:SetVisualStudioVersion
set VisualStudioVersion=14.0
goto :eof
:usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo or
echo %0 [option] store
echo where [option] is: x86 ^| amd64 ^| arm ^| x86_amd64 ^| x86_arm ^| amd64_x86 ^| amd64_arm
echo:
echo The store parameter sets environment variables to support
echo store (rather than desktop) development.
echo:
echo For example:
echo %0 x86_amd64
echo %0 x86_arm store
goto :eof
:missing
echo The specified configuration type is missing. The tools for the
echo configuration might not be installed.
goto :eof
也就是说,区别在于
:x86_amd64
if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" %2
goto :SetVisualStudioVersion
和
:amd64_x86
if not exist "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" goto missing
call "%~dp0bin\amd64_x86\vcvarsamd64_x86.bat" %2
goto :SetVisualStudioVersion
之间
亦即
x86_amd64\vcvarsx86_amd64.bat
和
amd64_x86\vcvarsamd64_x86.bat
之间的区别
用beyond compare比较它两,差不多两百行的脚本比较,我就傻在这里了 ...
然后我查有关计算机体系架构的资料,有太多似是而非或者聊当放屁的“文章”,而以下一文对我有些许帮助:
现在的x86 CPU在位数上有32/64bit之分,在ARCH上有又x86/x86_64/x64/i386/IA32/IA64/amd64,最近又新出来一个x32,还好不是ARCH,只是ABI,没有那么混乱。
先说一下x86的这些arch,不要求很严格的话,基本上可以用下面的公式来表达:
x86=i386=IA32
amd64=x86_64=x64!=IA64
其实这两个等式里很多都是别名,严格说的话,x86的世界里只存在x86/x86_64/IA64三种架构。
当年AMD先于Intel推出向下兼容的amd64 CPU,而Intel推出的不兼容32位系统的IA64惨淡收场(被MS放了鸽子),后来Intel在指令上支持了amd64,不过不愿意叫amd64,改了个名字x86_64。
再说64bit/32bit的兼容性问题:
现在的64bit CPU实际上都做了兼容32bit的特殊设计,所以64bit的CPU上运行32bit的软件(包括kernel/app, driver除外)是没有问题。反过来,32bit的CPU上运行64bit的软件是不可以的。
最后说重点,64bit相比32bit的性能优势:
这里不考虑64bit硬件上运行32bit软件的这种过度方式。
从架构上来说,64bit拥有64bit 的register和64bit的bus,在数据传输效率上比32bit要高不少;另外,64bit地址总线的寻址空间突破了4G的限制。
所以,对于大内存,密集数据运算的应用场景,64bit的优势是非常明显的。网上有一些benchmark,这里不贴了。
但是,对于小内存系统,64bit的CPU在某些状况下可能比32bit CPU的效率更低。
因为64 bit的CPU的地址是64位的,指针是64位的,编译生成的二进制文件更大,运行时占用的内存更多;另一方面,因为64位地址的问题,cache中能存放的指令就更少,所以更容易导致cache的miss。
所以在某些应用场景,64 bitCPU的更大的寻址空间,更快的数据传递,更快的浮点运算的特性, 与其64 bit的地址/指针所导致的cache miss的特性,始终并存。
为了充分利用64的优势,又避免64bit地址导致的cache miss的问题,Intel提出了x32 ABI的概念。
x32不是一个ARCH,是一个ABI。
x32可以充分的使用64 bit硬件的64 bit寄存器,64bit总线,以及64bit新增的指令,从而获得更快的数据处理速度。
同时x32又使用32bit的地址/pointer,32bit的C数据类型,因此cache miss并不会增加。
x32是一个ABI,其设计到的部分包括:kernel的support,toolchain的support,system lib的support。现在kernel(from 3.4)和toolchain的support都已经OK。
refrence:
http://blog.claudxiao.net/2012/05/x32-abi/
http://blog.csdn.net/force_eagle/article/details/7860574
但就算看到如此,我还是没有搞懂
x86_amd64\vcvarsx86_amd64.bat
和
amd64_x86\vcvarsamd64_x86.bat
之间的区别
来源:oschina
链接:https://my.oschina.net/u/101691/blog/509361