本人在構建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
之間的區別
性能