隨著64位windows的慢慢普及,現(xiàn)在做windows下的應用開發(fā)鸠窗,尤其是系統(tǒng)的一些插件的開發(fā)(IE停忿、Explorer等)中鼠,越來越需要同時開發(fā)32位和64位的版本了可婶,這就要我們在寫代碼的時候尤其注意對指針和整型數(shù)據(jù)的操作,以避免出問題援雇。
同一份代碼矛渴,可以根據(jù)Platform為Win32或X64來產(chǎn)出對應的版本,這是我們的目的惫搏。
字長模型
指針類型一般是跟隨系統(tǒng)位數(shù)的曙旭,32位系統(tǒng)下指針為32位,64位系統(tǒng)下指針為64位晶府,這個一般不會混淆,但是來到整型數(shù)據(jù)類型的時候钻趋,這里就有字長模型的區(qū)別了川陆。
字長模型中I表示int,L表示long蛮位,P表示pointer较沪,LL表示long long,如ILP32指int失仁、long尸曼、pointer都是32位,LLP64指long long和pointer是64位萄焦。
32位系統(tǒng)有ILP32和LP32兩種控轿,64位系統(tǒng)有LP64、ILP64拂封、LLP64三種茬射,這都是常見的字長模型,出現(xiàn)這些模型的原因是C/C++語言并有沒有規(guī)定諸如int冒签、long等這些整型的長度在抛,只是規(guī)定了這些類型的長度下限和相互的大小關(guān)系(如short <= int <= long <= long long),具體的實現(xiàn)由各個編譯器自行決定萧恕。
我們先來看一下在不同的字長模型下刚梭,不同整型所占用的空間大小:
LP32 | ILP32 | LLP64 | LP64 | ILP64 | |
---|---|---|---|---|---|
char | 8 | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 | 16 |
int | 16 | 32 | 32 | 32 | 64 |
long | 32 | 32 | 32 | 64 | 64 |
long long | 64 | 64 | 64 | 64 | 64 |
pointer | 32 | 32 | 64 | 64 | 64 |
Visual C++使用的字長模型
VC的32位字長模型是ILP32票唆,而64位字長模型是LLP64朴读,這是因為從32位往64位遷移的時候,為了盡量減少兼容性的問題走趋,所以除了指針的位數(shù)從32位升到64位之外磨德,其他整型的長度都沒有變化。所以用vc進行64位程序開發(fā)和32位程序開發(fā)最大的不同就是指針的大小。
另外典挑,long long是C99才引入的酥宴,所以是VC6之后才支持這個類型,相比與long long您觉,windows下更常用的是__int64(long long也是__int64 typedef的)
類UNIX系統(tǒng)的各類編譯器在64位下一般都是使用LP64字長模型拙寡。
32位/64位程序一體開發(fā)
要達到一套代碼自適應32位和64位,我們就需要用到windows給我們定義的兩套數(shù)據(jù)類型琳水,一種是精準的數(shù)據(jù)類型肆糕,其不論在32位還是64位下大小都是一樣的(一般以長度結(jié)尾),如DWORD32在孝、DWORD64诚啃、INT32、INT64私沮、UINT32始赎、UINT64等;另一種就是所謂的“多態(tài)類型”仔燕,其長度以指針的長度作為基準(一般以_PTR結(jié)尾)造垛,常用的有:LONG_PTR、ULONG_PTR晰搀、UHALF_PTR(無符號指針長度的一半)五辽、LPARAM、WPARAM(即UINT_PTR)
總的來說外恕,指針我們一般都要使用_PTR這種類型杆逗,如果需要確定長度的就使用精確類型,其他情況普通類型也可以勝任鳞疲。