C++ 結構體struct和共同體union的區別
//聯絡人:石虎 QQ:1224614774 暱稱:嗡嘛呢叭咪哄
一、概念
1.定義:
結構體struct:把不同型別的資料組合成一個整體,自定義型別。
共同體union: 使幾個不同型別的變數共同佔用一段記憶體。
2.地址:
struct和union都有記憶體對齊,結構體的記憶體佈局依賴於CPU、作業系統、編譯器及編譯時的對齊選項。
二、關於記憶體對齊,四個重要的基本概念:
1.資料型別自身的對齊值:
對於char型資料,其自身對齊值為1,對於short型為2,對於int,float,double型別,其自身對齊值為4,單位位元組。
2.結構體或者類的自身對齊值: 其成員中自身對齊值最大的那個值。
3.指定對齊值: #pragma pack(n),n=1,2,4,8,16改變系統的對齊係數
4.資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。
注意:long int和int一樣是4byte,long double和double一樣是8byte。
三、常見資料型別及其長度:
1.在標準c++中,int的定義長度要依靠你的機器的字長,也就是說,如果你的機器是32位的,int的長度為32位,如果你的機器是64位的,那麼int的標準長度就是64位。
圖:
2.首先根據結構體內部成員的自身對齊值得到結構體的自身對齊值(內部成員最大的長度),如果沒有修改系統設定的預設補齊長度4的話,取較小的進行記憶體補齊。
四、結構體struct和共同體union區別
結構體struct:不同之處,stuct裡每個成員都有自己獨立的地址。sizeof(struct)是記憶體對齊後所有成員長度的加和。
共同體union: 當共同體中存入新的資料後,原有的成員就失去了作用,新的資料被寫到union的地址中。sizeof(union)是最長的資料成員的長度。
五、總結:
1.struct和union都是由多個不同的資料型別成員組成, 但在任何同一時刻, union中只存放了一個被選中的成員, 而struct的所有成員都存在。
2.在struct中,各成員都佔有自己的記憶體空間,它們是同時存在的。一個struct變數的總長度等於所有成員長度之和。
3.在union中,所有成員不能同時佔用它的記憶體空間,它們不能同時存在。Union變數的長度等於最長的成員的長度。對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的。
謝謝!!!
相關文章
- [C++]結構體、共同體和列舉型別C++結構體型別
- Struct 和 Union有下列區別Struct
- union, struct, enum 的 大小區別Struct
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- 結構體struct結構體Struct
- C++中結構體與類的區別C++結構體
- go 結構體 (struct) 和方法 (method)Go結構體Struct
- C++中 struct 和 class 的區別C++Struct
- C++中struct 和 class的區別C++Struct
- union all和union的區別
- union和union all的區別
- c語言中的結構(struct)和聯合(union)簡介(轉)C語言Struct
- 結構體定義:struct與typedef struct 用法詳解和用法小結結構體Struct
- C++基礎(八)struct和class的區別C++Struct
- union 和union all 使用區別
- C++ protected許可權成員以及類和結構體區別C++結構體
- sql中UNION和UNION ALL的區別SQL
- Golang 學習——結構體 struct (一)Golang結構體Struct
- Golang 學習——結構體 struct (二)Golang結構體Struct
- 瞭解下C# 結構體(Struct)C#結構體Struct
- Opensturt和Struct區別Struct
- 結構體定義 typedef struct 用法詳解和用法小結結構體Struct
- C# 中 Struct 和 Class 的區別總結C#Struct
- msyql jion 和 union 的區別
- struct和union和enum宣告的語法Struct
- struct 結構體 -Go 學習記錄Struct結構體Go
- golang 學習之路之 struct 結構體GolangStruct結構體
- Union與Union All的區別
- C# 結構體與類的區別C#結構體
- C與C++中struct使用的區別C++Struct
- 上下文 Context 與結構體 StructContext結構體Struct
- 【SQL】UNION ALL 與UNION 的區別SQL
- struct 和 interface:結構體與介面都實現了哪些功能?Struct結構體
- swift中Class和Struct的區別SwiftStruct
- C語言中結構體struct的對齊問題C語言結構體Struct
- C# 中的只讀結構體(readonly struct)C#結構體Struct
- c++結構體、共用體(聯合體)C++結構體
- Union和Union All到底有什麼區別