32 64位資料型別占用位元組以及記憶體對齊原理

2021-10-24 08:53:11 字數 1267 閱讀 1822

char :1個位元組

char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)

short int : 2個位元組

int: 4個位元組

unsigned int : 4個位元組

float: 4個位元組

double: 8個位元組

long: 4個位元組

long long: 8個位元組

unsigned long: 4個位元組

char :1個位元組

char*(即指標變數): 8個位元組

short int : 2個位元組

int: 4個位元組

unsigned int : 4個位元組

float: 4個位元組

double: 8個位元組

long: 8個位元組

long long: 8個位元組

unsigned long: 8個位元組

假設我們同時宣告兩個變數:

char a;

short b;

用&(取位址符號)觀察變數a,

如果a的位址是0x0000,那麼b的位址將會是0x0002或者是0x0004。

但是如果b的位址為0x0002,

那麼cpu只需一次讀操作就可以獲得b的值了。所以編譯器為了優化**,往往會根據變數的大小,將其指定到合適的位置,即稱為記憶體對齊(對變數b做記憶體對齊,a、b之間的記憶體被浪費,a並未多佔記憶體)。

結構體所占用的記憶體與其成員在結構體中的宣告順序有關,其成員的記憶體對齊規則如下:

(1)每個成員分別按自己的對齊位元組數和ppb(指定的對齊位元組數,32位機預設為4)兩個位元組數最小的那個對齊,這樣可以最小化長度。如在32bit的機器上,int的大小為4,因此int儲存的位置都是4的整數倍的位置開始儲存。

(2)複雜型別(如結構)的預設對齊方式是它最長的成員的對齊方式,這樣在成員是複雜型別時,結構體陣列的時候,可以最小化長度。

(3)結構體對齊後的長度必須是成員中最大的對齊引數(ppb)的整數倍,這樣在處理陣列時可以保證每一項都邊界對齊。

(4)結構體作為資料成員的對齊規則:在乙個struct中包含另乙個struct,內部struct應該以它的最大資料成員大小的整數倍開始儲存。如 struct a 中包含 struct b, struct b 中包含資料成員 char, int, double,則 struct b 應該以sizeof(double)=8的整數倍為起始位址。

C語言資料型別占用位元組大小

在昨天的筆試的時候碰到了乙個關於不同的資料型別占用位元組大小的問題,於是就想歸納整理一下關於這方面的問題。於是就寫了一下,在linux系統下用gcc編譯驗證了一下,以供參考。16位編譯器 char unsigned char 1位元組 char 2位元組 short int 2位元組 int uns...

32 64位作業系統資料型別位元組對比

int型字長問題 c c 規定int字長和機器字長相同 作業系統字長和機器字長未必一致 編譯器根據作業系統字長來定義int字長 由上面三點可知,在一些沒有作業系統的嵌入式計算機系統上,int的長度與處理器字長一致 有操作 系統時,作業系統的字長與處理器的字長不一定一致,此時編譯器根據作業系統的字長來...

mysql 資料型別及占用位元組數

只有當設計表結構的時候才會思考資料型別的問題,很久不用就會忘記,寫篇部落格算是記錄加複習吧。以下摘自網路,也沒時間蒐集太多,就列舉幾個常用的。數字型別 根據位元組數即可算出表示的範圍了 tinyint 1 位元組 smallint 2 個位元組 mediumint 3 個位元組 int 4 個位元組...