聯合體 結構體的一些整理

2021-06-09 03:59:33 字數 2311 閱讀 9021

聯合體:採用

little-endian

模式的cpu

對運算元的存放方

式是從低位元組到高位元組,而

big-endian

模式對運算元的存放方式是從高位元組到低位元組。例如,

16bit

寬的數0x1234

在little- endian

模式cpu

記憶體中的存放方式(假設從位址

0x4000

開始存放)為:

記憶體位址

存放內容

0x4000 0x34 

0x4001 0x12 

而在big-endian

模式cpu

記憶體中的存放方式則為:

記憶體位址

存放內容

0x4000 0x12 

0x4001 0x34 

main()

half;

}number;

number.i=0x4241; 

number.half.first = 0x41, number.half.second = 0x42

number.half.first='a'; 

number.half.second='b';

number.i = 0x6261

}number.i 和 number.half 共用一塊記憶體空間, 記憶體大小為兩者中較大的記憶體大小。 

結構體:

結構中的變數按照型別大小從大到小或者從小到大順序宣告

,儘量減少中間的填補空間

1為什麼要進行位元組對齊

看下面的資料結構宣告:

struct a

;

struct a a;

假設變數a存放在記憶體中的起始位址為0x00,那麼其成員變數c的起始位址為0x00,如果不考慮位元組對齊成員變數i的起始位址為0x01,變數a一共占用了5個位元組。如若cpu要對成員變數i進行訪問,那麼情況就變得有點複雜了,首先cpu用了乙個讀週期,從0x00處讀取了4個位元組(注意由於是32位架構),然後將0x01-0x03的3個位元組暫存,接著又花費了乙個讀週期讀取了從0x04-0x07的4位元組資料,將0x04這個位元組與剛剛暫存的3個位元組進行拼接從而讀取到成員變數i的值。為了讀取這個成員變數i,cpu花費了整整2個讀週期。試想一下,如果資料成員i的起始位址被放在了0x04處,那麼讀取其所花費的週期就變成了1,顯然引入位元組對齊可以避免讀取效率的下降,但這同時也浪費了3個位元組的空間(0x01-0x03)。

這也是空間和時間的博弈。

2 先讓我們看四個重要的基本概念:

1.資料型別自身的對齊值:

: 對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,系統會給陣列乙個元素乙個元素的分配記憶體空間,單位位元組。

2.結構體或者類的自身對齊值:

:其成員中自身對齊值最大的那個值。

3.指定對齊值:

:#pragma pack(value)時的指定對齊值value。

4.資料成員、結構體和類的有效對齊值:

:自身對齊值和指定對齊值中小的那個值。

有效對齊n,就是表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0"。.而資料結構中的資料變數都是按定義的先後順序來排放的。

例:假設在x86機器上,假設編譯器按預設4位元組進行對齊。

struct a

;

首先來看sizeof(struct a),假設a的起始位址為0x00,做這樣的假設只是為了更方便理解,其實a始終被放在對齊邊界上。

資料成員c的自身對齊值=1,指定對齊值=4,所以其有效對齊值為1,因0x00%1==0,所以它被存放在0x00處;資料成員i的自身對齊值=4,指定對齊值=4,可得出其有效對齊值為4,因0x01%4 != 0,因此它應該被存放在0x04位址處,並占用0x05,0x06,0x07共4個位元組;接下來看資料成員s的自身對齊值=2,指定對齊值=4,得出有效對齊值為2,因0x08%2 == 0,因此它被存放在起始位址為0x08處,並占用2位元組;最後再看資料結構a自身的對齊值=4(最大資料成員自身對齊值),指定對齊值=4,得有效對齊值為4,對於結構體或者類,要將它們補充成其有效對齊值的整數倍,這點請千萬注意)。由此可見sizeof(struct a)的結果應該是=1+3(空閒空間)+4+2+2(結構體補充)=12位元組

結構體聯合體

在c中,結構也是一種資料型別,可以使用結構變數,因此,象其它型別的變數一樣,在使用結構變數時要先對其定義。定義結構變數的一般格式為 struct 結構名 結構變數 結構名是結構的識別符號不是變數名。型別為第二節中所講述的五種資料型別 整型 浮點型 字元型 指標型和無值型 構成結構的每乙個型別變數稱為...

聯合體 位域結構體 聯合體的妙用

在c語言中,變數的定義是分配儲存空間的過程。一般的,每個變數都具有其獨有的儲存空間,那麼可不可以在同乙個記憶體空間中儲存不同的資料型別 不是同事儲存 呢?答案是可以的,使用聯合體就可以達到這樣的目的。聯合體也叫共用體,在c語言中定義聯合體的關鍵字是union。定義乙個聯合型別的一般形式為 union...

結構體 聯合體 列舉

1 結構體struct 結構體的作用 在網路協議 通訊控制 嵌入式系統的c c 程式設計中,我們要傳送的不是簡單的位元組流 char型陣列 二是多種資料組合起來的乙個整體,其表現形式是乙個結構體。使用struct的注意事項 1 下面看乙個題目 結果 6 12 這裡涉及到結構體的記憶體對齊方式。1 關...