結構體位元組對齊

2021-10-09 09:00:10 字數 2482 閱讀 1791

3、pragma pack(n)的作用

32位系統下:

sizeof

(short)=

2sizeof

(int)=

4sizeof

(long)=

4sizeof

(double)=

8sizeof

(float)=

4sizeof

(指標)=4

64位系統下:

sizeof

(short)=

2sizeof

(int)=

4sizeof

(long)=

4sizeof

(double)=

8sizeof

(float)=

4sizeof

(指標)

=8

規則如下:

1、每乙個變數的起始位址是自身大小的整數倍

2、最終結構體所佔位元組大小需要是結構體中最大變數的整數倍

#include

#include

using namespace std;

typedef

struct mystruct1

mys1;

typedef

struct mystruct2

mys2;

intmain()

聯合體中的各個成員都是從同一位址開始儲存的,每一時刻只能儲存乙個成員,這樣就需要在分配記憶體時滿足兩點:

(1)、共用體所佔記憶體時其最大成員的大小

(2)、若是聯合體內部最大成員所佔的空間對其他成員不滿足整數倍關係,則需要自動延伸,使得滿足整數倍關係

union   mm 

;

本來聯合體mm所佔記憶體大小應該是sizeof(int)*5 = 20位元組,但是20位元組和其中double的8位元組不滿足整數倍關係,所以mm所佔的大小應該是24位元組

規則如下:

1、聯合體或者結構體作為成員變數時,需要從其內部最大元素的整數倍開始儲存

2、最終結構體所佔位元組大小需要是結構體中**最大變數(內部結構體中的最大變數)**的整數倍

#include

//本來mm的空間應該是sizeof(int) * 5 = 20; 但是如果只是20個單元的話,

//那可以存幾個double型(8位)呢 ? 兩個半 ? 當然不可以, 所以mm的空間延伸為既要大於20,

//又要滿足其他成員所需空間的整數倍, 即24

typedef

union mm mm1;

typedef

struct mystruct1

mys1;

typedef

struct mystruct2

mys2;

typedef

struct mystruct3

mys3;

typedef

struct mystruct4

mys4;

typedef

struct mystruct5

mys5;

// 取80位元組(是mys3中最大位元組double所佔8位元組的整數倍)

typedef

struct mystruct6

mys6;

// 取88位元組(是mys3中最大位元組double所佔8位元組的整數倍)

typedef

struct mystruct7

mys7;

typedef

struct mystruct8

mys8;

// 取152位元組(是最大位元組mys3中double所佔8位元組的整數倍)

pragma pack(n)用於設定指定對齊值大小, 若是自身對齊值 大於 指定對齊值,則選用指定對齊值。

注:自身對齊值大小就是變數所佔記憶體大小

#include

// 若是自身對齊值 大於 指定對齊值,則選用指定對齊值

#pragma pack(2)

// 設定指定對齊值為2

struct data1

;// 18位元組

#pragma pack()

// 恢復預設對齊值

struct data2

;// 24位元組

#pragma pack(4)

// 設定指定對齊值為4

struct data3

;// 20位元組

#pragma pack()

// 恢復預設對齊值

intmain()

結構體位元組對齊

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