結構體內存對齊,位段,列舉 聯合

2021-08-30 13:18:58 字數 3168 閱讀 3002

結構體內存對齊規則

1.第乙個成員在與結構體變數偏移量為0的位址處2.其他成員變數要對齊到對齊數的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的 較小值vs中預設的值為8,linux中的預設值為43.結構體總大小為最大對齊數(每乙個成員變數都有乙個對齊數)的整數倍4.如果巢狀了結構體的情況,巢狀結構體對齊到自己最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數

(含巢狀結構體的對齊數)的整數倍

為什麼存在記憶體對齊?

1.平台原因不是所有的硬體平台都能訪問任意位址上的任意資料的,某些硬體平台只能在某些位址處取某些特定型別的資料否則丟擲硬體異常2.效能原因資料結構(尤其是棧)應該盡可能地在自然邊界上對齊

原因在於,為了訪問未對齊的記憶體,處理器需要做兩次記憶體訪問,而記憶體對齊訪問僅需要一次訪問

總體來說結構體的記憶體對齊是拿空間來換取時間的做法

struct s

;struct s s = , 1000 };

//結構體傳參

void print1(struct s s)

//結構體位址傳參

void print2(struct s* ps)

int main()

上面print1和print2函式哪個好些?答案是首選print2函式

原因

在函式棧幀部分,我們知道函式傳參的時候,引數是需要壓棧的。如果傳遞乙個結構體物件的時候,結構體過大,

引數壓棧的系統開銷比較大,所以會導致效能的下降

結論:結構體傳參的時候,要傳結構體的位址。位段的宣告和結構是類似的,有兩個不同1.位段的成員必須是int ,unsigned,int或signed int。2.位段的成員名後邊有乙個冒號和乙個數字。

比如:

struct a

;

a就是乙個位段型別。位段a的大小為

printf("%d\n",sizeof(struct a));
位段的記憶體分配

1.位段的成員可以是int,unsigned int,signed int 或者是char(屬於整形家族)型別。

2.位段的空間上是按照需要以4個位元組(int)或者1個位元組(char)的方式來開闢的。

3.位段涉及很多不確定的因素,位段是不跨平台的,注意可移植的程式應該避免使用位段。

位段的跨平台問題

1.int位段被當成有符號數還是無符號數是不確定的。

2.位段中最大位的數目不能確定(16位機器最大是16,32位機器最大是32,寫成27,在16位機器會出現問題)

3.位段中的成員在記憶體中從左向右分配,還是從右向左分配標準尚未定義

4.當乙個結構包含兩個位段,第二個位段成員比較大,無法容納於第乙個位段剩餘的位時,是捨棄剩餘的位還是利用,是不確定的

總結:跟結構體相比,位段可以達到同樣的效果,但是可以很好的節省空間,但是有跨平台的問題存在

enum day//星期

;enum color//顏色

;

以上定義的enum day,enum color都是列舉型別中的內容是列舉型別的可能取值,也叫列舉常量。這些可能取值都是有值的,預設從0開始,一次遞增1,當然在定義的時候也可以賦初值。

列舉的優點:1.增加**的可讀性和可維護性2.和#define定義的標示符比較列舉有型別檢查,更加嚴謹。3.防止了命名汙染(封裝)4.便於除錯

5.使用方便,一次可以定義多個常量

聯合型別的定義

聯合也是一種特殊的自定義型別

這種型別定義的變數也包含一系列的成員,特徵是這些成員公用同一塊空間(所以聯合也叫共用體)

//聯合型別的宣告

union un

;//聯合變數的定義

union un un;

//計算聯合變數的大小

printf("%d\n", sizeof(un));

聯合的特點聯合的成員是共用同一塊記憶體空間的,這樣乙個聯合變數的大小,至少是最大成員的大小(因為聯合至少得有能力儲存最大的那個成員)

聯合大小的計算

1.聯合的大小至少是最大成員的大小

2.當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍

自定義型別 結構體 記憶體對齊 ,位段,列舉,聯合

結構體的基礎知識 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。1.結構的宣告 struct tag 結構體型別名 注意 1.宣告結構體型別時,必須用關鍵字struct,這裡的tag可以省略,但最好不要省略。2.這裡只是宣告了結構體型別,實際並不占用記憶體,只有定義了結...

結構體內存對齊與位段

二 位段 總結 編譯器在計算結構體大小時,發生記憶體對齊 如 struct s int main 問 程式的結果是多少?char 乙個位元組 int 4個位元組 1 4 5 答案是 8。a.第乙個成員偏移量為0。b.其他成員要在 偏移 對齊數的整數倍。對齊數 編譯器預設對齊數與成員變數大小中的較小值...

結構體,聯合體(共用體),列舉型別,位段,記憶體對齊

struct test 關鍵字 struct,表示其是乙個結構體,後面是乙個可選的標記 test 可以在分號前直接跟變數名,也可以在之後寫為struct test 變數名 strcut test 的作用類似於int 或float的宣告。若寫為 typedef strcut test test 則說明...