位元組對齊 結構體變數的sizeof

2021-10-22 16:59:34 字數 1345 閱讀 4855

首先回顧一下,32位與64位(指的是暫存器的位寬)作業系統下,不同資料型別所佔的位元組數:

32位作業系統環境下:

字元型:char 1; unsigned char 1

整型: int 4;unsigned int 4 ;short 2 ;unsigned short 2;long 4;unsigned long 4;

浮點型:float 4;double 8;long double 8;unsigned long double 8;unsigned double 8;

字串型:string 32 位元組

指標:所有型別的指標都是 4位元組;

聯合體union: 取其中占有位元組數最大的資料型別所占有的位元組數。

函式:除了void型。其他都函式占有的位元組數等於函式的返回型別所占有的位元組數。與函式體內部無關。

64位作業系統環境下:

字元型:char 1; unsigned char 1

整型: int 4;unsigned int 4 ;short 2 ;unsigned short 2;long 8;unsigned long 8

浮點型:float 4;double 8;

指標:所有型別的指標都是 8位元組;

以下預設在32位作業系統下。

一般來說,結構體變數佔據的記憶體大小是所有成員變數佔據記憶體大小之和,但有些例外需要特別注意,先看乙個結構體:、

struct stu1

;//需要在a1和b1之間加入乙個空位元組,最後返回結果是8;

//若交換成員變數的位置

struct stu2

;//需要在b1和c1之間加入兩個空位元組,在a1之後加入三個空位元組,最後返回結果是2+2+4+1+3=12;

//復合成員相對於結構體首位址的偏移量都是復合成員中最寬簡單型別成員大小的整數倍

//因此,下例當中,考慮b的最寬簡單型別成員時,要將型別為a的復合成員b_a打散,b_a偏移量為4的倍數

struct a

;//所以a是8;

struct b

;//1+3+8+1 13 要是4的倍數,因此末尾還要補上3個填充位元組,最後為16.

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

結構體每個成員相對於結構體首位址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組。

結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...

結構體位元組對齊

在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...