32 bit 与 64 bit 程序(2)比较
32 bit ?與 64 bit 程序(2)區(qū)別
由于操作系統(tǒng)內(nèi)存分配的不同,導(dǎo)致軟件開發(fā)過(guò)程中,需要編譯不同版本的軟件。
幾個(gè)重要概念:
?(1)這里所說(shuō)的的32位與64位程序,是指經(jīng)過(guò)編譯器編譯后的可執(zhí)行文件,例如像Windows上的exe文件,而最初編寫的源碼并沒(méi)有32位和64位之說(shuō)。
(2)不是所有的程序需要區(qū)分32位和64位,對(duì)于原生語(yǔ)言例如C語(yǔ)言編寫的程序需要區(qū)分64位與32位,但是對(duì)于像Java這樣的語(yǔ)言,就不需要這樣了,因?yàn)镴ava編寫的程序是在JVM(Java虛擬機(jī))上運(yùn)行的,JVM屏蔽了具體的硬件細(xì)節(jié)。
(3)32位與64位的程序的本質(zhì)區(qū)別在于:兩者最終在處理器CPU上運(yùn)行的指令是不一樣的
平臺(tái)的所指的是:CPU +OS +?軟件?
軟件: 【源碼】 + 編譯器 【64/32】= exe【64/32】
?
一、處理器CPU的不同(64bit, 32bit):
主要是指:64位CPU,32位CPU, 對(duì)于歷史中的16bit的處理器,則不是當(dāng)今主流不講。
注意:CPU的不同bit ,內(nèi)部的指令集,操作位數(shù),寄存器名稱和個(gè)數(shù)都不同。
一、比如一條mov eax,1指令,可能在32bCPU上對(duì)應(yīng)的機(jī)器指令是0x1201;在64位機(jī)器上就是0x123401。 二、64位CPU里的寄存器是64位的,這樣CPU每次處理的數(shù)據(jù)量也就更大,32位CPU寄存器是32位的。 三、64位CPU里的寄存器數(shù)量也多于32位CPU。 四、32位CPU的地址總線不一定是32位的,還有可能是48位的,同樣64位的CPU地址總線也不一定是64位,往往都是48位。 五、現(xiàn)在對(duì)于主流的處理器,64位的CPU是能夠兼容32位指令架構(gòu)的!!!!!!(1)從上面可以看到64位CPU的運(yùn)算能力理論上比32位CPU強(qiáng)很多。
(2)現(xiàn)在32位的CPU一般是X86架構(gòu)的,從80386開始就是32位的CPU,也對(duì)應(yīng)他的32位指令集。
(3)后來(lái)發(fā)展出64位CPU,從X86擴(kuò)展出64位的指令集,一般我們就叫做X64,也叫AMD64架構(gòu),因?yàn)樽钤缡茿MD推出64位CPU的。
二、操作系統(tǒng)OS(64bit, 32bit):
1. OS與CPU的關(guān)系
?
(1)32位的操作系統(tǒng)是專門為32位CPU設(shè)計(jì)的,同樣64位的操作系統(tǒng)是為64位的CPU設(shè)計(jì)的。
(2)前面也說(shuō)了,64位的CPU能夠兼容32位指令架構(gòu),因此在64位CPU上也可以安裝32位操作系統(tǒng)。
(3)32bit的操作系統(tǒng)安裝再32bit CPU, 64bit 的OS安裝再64bit CPU才能將OS發(fā)揮最大優(yōu)勢(shì)。
(4)32bit的編譯器也可以編譯64bit 的程序。
2. 尋址空間的影響
?64bit CPU擁有更大的尋址能力,使用最大為192GB內(nèi)存,而32bit只支持4G內(nèi)存.
64位CPU一次可提取64位數(shù)據(jù),比32位提高了一倍,理論上性能會(huì)提升1倍。但這是建立在64bit操作系統(tǒng),64bit軟件的基礎(chǔ)上的。
之所以叫做“64位處理器”,是因?yàn)殡娔X內(nèi)部都是實(shí)行2進(jìn)制運(yùn)算,處理器(CPU)一次處理數(shù)據(jù)的能力也是2的倍數(shù)。8位處理器、16位處理器、32位處理器和64位處理器,其計(jì)數(shù)都是2的倍數(shù)。一次處理的數(shù)據(jù)越大,該電腦處理信息的能力越來(lái)越大;因此64位處理在先天就比32位處理器具有快速的能力。那為什么不用更高級(jí)的128位處理器呢?因?yàn)槲粩?shù)越高,處理器芯片的設(shè)計(jì)也就越復(fù)雜,目前的技術(shù)水平暫時(shí)無(wú)法制造這么復(fù)雜的芯片。
?
3. 程序軟件【32bit, 64bit】
(1)32位的程序就是將源碼用32位的編譯器編譯的,64位的程序就是將源碼用64位的編譯器編譯的。
(2)應(yīng)用程序只接觸邏輯地址,并不接觸真實(shí)的物理地址。
32位的程序理論上可以申請(qǐng)利用4GB的地址空間,64位的程序則可以申請(qǐng)利用大于4GB 的地址空間,這也是64位程序的一個(gè)巨大優(yōu)勢(shì)。
我們知道應(yīng)用程序的運(yùn)行是需要操作系統(tǒng)作為支撐的,這些程序在運(yùn)行時(shí)常常需要進(jìn)行一些系統(tǒng)調(diào)用,還有各種庫(kù)函數(shù)等。
這些可執(zhí)行文件【exe】能否順利運(yùn)行有著兩個(gè)最重要的地方。 1)動(dòng)態(tài)鏈接庫(kù)。2)系統(tǒng)API。
對(duì)于Windows系統(tǒng)而言,64位的系統(tǒng)往往還具有32位系統(tǒng)的庫(kù),因此在64位系統(tǒng)上能夠運(yùn)行32位的程序,但是反過(guò)來(lái)就不行了,因?yàn)?2位系統(tǒng)一般沒(méi)有64位系統(tǒng)的庫(kù)。
可以通過(guò)博客:https://www.cnblogs.com/icmzn/p/10269911.html?
再64bit 的 Window系統(tǒng)中,32bit 的exe 調(diào)用的是目錄下的系統(tǒng)dll:C:\ Window\SysWOW64\....,這里的SysWOW64,表示的意思是: 32bit 的軟件在Window 64 位OS上運(yùn)行的32bit 的dll 系統(tǒng)文件。
64bit 的exe則調(diào)用的目錄的系統(tǒng)dll: c:、Window\Win32\...?
注意:這里的Win32可能是歷史遺留問(wèn)題,這樣對(duì)于Window 64 的改動(dòng)較小,我猜測(cè)的,哈哈哈
?
64exe 調(diào)用的64bit OS的系統(tǒng)dll文件
?
?
?
64bit 處理器優(yōu)勢(shì):
(1)硬件, 執(zhí)行速度更快, 更大的內(nèi)存管理。
(2)軟件, 最新的尖端軟件首選64bit 操作系統(tǒng)作為開發(fā)平臺(tái)。
64bit處理器劣勢(shì):
(1)硬件, 部分的驅(qū)動(dòng)程序?qū)?4bit 的系統(tǒng)支持不高, 例如對(duì)于工業(yè)控制領(lǐng)域,更多的模塊提供了32bit 的控制庫(kù)文件,而沒(méi)有64bit的版本。
(2)軟件, 由于操作系統(tǒng)是64bit 的,導(dǎo)致很多歷史中的32bit 的exe 不能再64系統(tǒng)上兼容,可能出現(xiàn)計(jì)算誤差。
2.?代碼中的基本的數(shù)據(jù)類型,會(huì)根據(jù)操作系統(tǒng)的位數(shù)分配內(nèi)存大小:
因此在64位上對(duì)int型數(shù)據(jù)操作,編譯生成32的程序,有可能導(dǎo)致int型越界,軟件出現(xiàn)問(wèn)題
?不同的平臺(tái)上對(duì)不同數(shù)據(jù)類型分配的字節(jié)數(shù)是不同的,數(shù)據(jù)類型的字節(jié)數(shù)應(yīng)該是由CPU決定的,但是實(shí)際上主要由編譯器決定(占多少位由編譯器在編譯期間說(shuō)了算)。
常用數(shù)據(jù)類型對(duì)應(yīng)字節(jié)數(shù):
可用如sizeof(char),sizeof(char*)等得出
測(cè)試程序:
#include "stdafx.h" #include <iostream> #include <string> using namespace std; //main int _tmain(int argc, _TCHAR* argv[]) { cout << "sizeof(char):" << sizeof(char) << endl; cout << "sizeof(short):" << sizeof(short) << endl; cout << "sizeof(int):" << sizeof(int) << endl; cout << "sizeof(long):" << sizeof(long) << endl; cout << "sizeof(long long):" << sizeof(long long) << endl; cout << "sizeof(unsigned int):" << sizeof(unsigned int) << endl; cout << "sizeof(float):" << sizeof(float) << endl; cout << "sizeof(double):" << sizeof(double) << endl; void* pointer; cout << "sizeof(pointer):" << sizeof(pointer) << endl; system("pause"); return 0; }?
32bit 的編譯器下測(cè)試輸出:數(shù)據(jù)類型長(zhǎng)度
64 bit 的編譯器下測(cè)試輸出:數(shù)據(jù)類型長(zhǎng)度
注意:
(1)32位和64位系統(tǒng)在Windows下基本數(shù)據(jù)類型的大小都是一樣的。只有指針的大小不一樣!32位指針大小為4byte,而64位的指針大小為8byte。
(2) Linux下,long型是64位的,這一點(diǎn)是和Windows不同的地方。
?
為什么Windowsx64下long也為4byte?
正常標(biāo)準(zhǔn)的話,long應(yīng)該也是64位即8byte。但是在Windows下,我們的結(jié)果卻是4byte。為什么會(huì)這樣呢?
因?yàn)?#xff1a;
我們編程時(shí)很少關(guān)注數(shù)據(jù)類型真正的大小,畢竟即使不關(guān)注這個(gè)也可以編程,而且我們習(xí)慣了Win32,到64位下,只有指針因?yàn)閷ぶ沸枰潜仨氉兂?4位的,64位的指針尋址范圍是0~2^64-1,而其他的數(shù)據(jù)類型基本已經(jīng)夠用,如果把所有數(shù)據(jù)類型變成64位,明顯是浪費(fèi)空間。再者,為了讓32位和64位程序兼容運(yùn)行,能少修改還是少修改,所以Windows僅將指針大小進(jìn)行了修改。這樣,程序可以兼容運(yùn)行。
指針的大小比較?
int類型指針,通用指針void*, 類指針, 函數(shù)指針的長(zhǎng)度確定:
#include "stdafx.h" #include <iostream> #include <string> using namespace std; class Test { int num; string name; }; //一個(gè)函數(shù)指針 typedef void(*pFunc)(void); void PrintHello(void) { cout << "hello world" << endl; } //main int _tmain(int argc, _TCHAR* argv[]) { int* pInt; void* pVoid; Test* pTest = new Test(); pFunc pfunc = PrintHello; cout << "sizeof(pInt):" << sizeof(pInt) << endl; cout << "sizeof(pVoid):" << sizeof(pVoid) << endl; cout << "sizeof(pTest):" << sizeof(pTest) << endl; cout << "sizeof(pFunc):" << sizeof(pfunc) << endl; system("pause"); return 0; } 結(jié)果: Win32下: sizeof(pInt):4 sizeof(pVoid):4 sizeof(pTest):4 sizeof(pFunc):4 請(qǐng)按任意鍵繼續(xù). . . x64下: sizeof(pInt):8 sizeof(pVoid):8 sizeof(pTest):8 sizeof(pFunc):8 請(qǐng)按任意鍵繼續(xù). . .不管指針指向張三李四還是王二麻子,都是一樣大的。能夠影響指針大小的,還是位數(shù)。32位下指針大小為4,64位下指針的大小為8.
?
?
總結(jié):
(1)32位升級(jí)到64位不是簡(jiǎn)單的重新編譯發(fā)布一下就可以了。舉個(gè)例子,在32位C語(yǔ)言環(huán)境里一個(gè)指針可以放入一個(gè)int型的變量中,但在64位里就不行了了,因?yàn)?4位程序里的指針為64位,這樣的話程序肯定就爆了,因此對(duì)于某些程序如果想要升級(jí)到64位,則需要修改源碼,這個(gè)工作是相當(dāng)繁瑣的。
(2)由于64位操作系統(tǒng)的尋址和偏移的問(wèn)題,也有可能導(dǎo)致程序在運(yùn)行過(guò)程中,計(jì)算結(jié)果與32位系統(tǒng)不一致?
(3)64位CPU可以運(yùn)行32位或者64位的操作系統(tǒng),64位操作系統(tǒng)可以運(yùn)行32位或64位程序。
(4)32位CPU只能安裝32位的操作系統(tǒng),而32位操作系統(tǒng)只能運(yùn)行32位的程序。
(5),第一個(gè)64位的程序是怎么來(lái)的,因?yàn)槟莻€(gè)時(shí)候還沒(méi)有64位的編譯器,其實(shí)很簡(jiǎn)單,32位的編譯器也可以編譯出64位的程序?,當(dāng)然這個(gè)問(wèn)題就沒(méi)有必要深究了
?
endl;
轉(zhuǎn)載于:https://www.cnblogs.com/icmzn/p/10269868.html
總結(jié)
以上是生活随笔為你收集整理的32 bit 与 64 bit 程序(2)比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 206 Reverse
- 下一篇: OpenStack组件——Keyston