本人在构建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内容以下
shell
@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
和
app
: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
之间的区别
性能