許多計算機系統對基本資料型別的合法位址做出了一些限制,要求某種型別物件的位址必須是某個值k(通常是2,、4、8)的倍數,這種對齊限制簡化了形成處理器和儲存器系統之間介面的硬體設計,並且提高了訪問效率,雖然可能浪費了空間。所以了解對齊,可以使我們在不降低效率的情況下以最低的空間儲存資料
不同的硬體結構對對齊有不同的要求,ia32(intel architecture 32)硬體無論資料是都對齊,都能正常工作,但是,intel還是建議要資料對齊以提高儲存器系統效能。
對linux系統來說,2位元組資料型別(如short)的位址必須是2的倍數,而較大的資料型別(int、int*、float、double)的位址必須是4的倍數。
對windows不一樣,double或者long long型別資料的位址是8的倍數。
看一下測試**:(win7 32bit vc++平台)
#include struct a ;
struct b ;
#pragma pack(1) //按1位元組對齊
struct c ;
#pragma pack() //取消對齊
struct test ;
struct testoptimize ;
#pragma pack(1)
struct test1 ;
#pragma pack()
int main()
列印結果:
對於a,char後面補齊是為了int能夠對齊,但是為什麼short後面也插入兩個位元組呢,因為a可能被申明為乙個陣列,如果是陣列,也必須滿足每個元素位址是4的倍數對齊,因此會被補齊。結構體缺省會以占用空間最大的那個欄位的位元組數倍數為位址值
並且可以看出b是對a的一種優化,調整一下字段儲存順序,就可以節省出一些空間,並且不影響訪問效率
同樣的**,我們在linux系統下再做測試(ubuntu 14.04.2 lts \n \l x86_64 x86_64 x86_64 gnu/linux (gcc version 4.8.2 (ubuntu 4.8.2-19ubuntu1) ))我的是ubuntu64位系統
輸出結果:128
7484035
這裡test 和testoptimize和test1都不一樣了。因為64位系統指標型別是64bit即8 b。下面是在win7 32 vc6.0下test/testoptimize/test1與ubuntu64 gcc4.8.2下面的對比。
總結:1.位元組對齊是和硬體相關的限制,一些硬體必須要位元組對齊(從而提高訪問效率),另外一些硬體可以支援對齊或者不對齊,像ia32架構,但是建議位元組對齊,這樣能夠提高儲存器效率。
2.基本資料型別存放首位址一般是該資料型別自身長度的整數倍,一般都是1、2、4、8的倍數。對於復合資料型別,像結構體,首位址需要是他成員中最長欄位的整數倍。
3.另外,結構體為了滿足結構體陣列的儲存要求,可能在最後面也補0以便下乙個元素的首位址也是對齊的。計算結構體所佔的記憶體空間有乙個小技巧,就是畫位圖。通過最長字段確定點陣圖的寬度,然後再根據各個欄位首位址對齊要求,畫出整個位圖。就像我上面的圖一樣。
4.注意,不同平台不同編譯器最後的對齊效果也不一定相同,欄位的位置具體在哪個地方也是有多種可能的。
計算機中資料的儲存形式
在計算機中如何表示?8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?很容易想到,可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數。比如,在8位機中,規定每個位元組的最高位為符號位。那麼,8就是00001000,而 8則是10001000。但是,隨便找...
資料在計算機中的儲存
首先,我們為什麼要知道這個呢?我們只需要知道這個東西怎麼用不就好了嗎?我想,你可能忽視了你還是乙個程式設計師。好了言歸正傳我們來講講計算機中資料的儲存方式。我們都知道在計算機中所有的資料是以二進位制的形式儲存的,那麼你們有沒有想過01這些資料是怎麼存在計算機當中的呢?不知道你們有沒有聽過乙個東西,叫...
計算機中資料的儲存和排列
二 資料的排列方式 總結在計算機系統中,資料是以位元組為單位的,每乙個位址單元都對應著乙個位元組,乙個位元組為8bit,而且多位元組的資料在記憶體裡一定是佔連續的幾個位元組的,這就意味著位數大於8位的處理器,由於暫存器寬度大於乙個位元組,就變存在著多個位元組的安排問題。因此就導致了大端儲存模式和小端...