1. 程式人生 > >結構體和聯合體在記憶體分佈中的總結

結構體和聯合體在記憶體分佈中的總結

 結構體記憶體分佈三大原則:

原則1:資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始儲存,double為8位元組,那麼存放的位置從8的位數開始)。

原則2:結構體作為成員:如果一個結構裡有其他結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)

原則3:收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍,不足的要補齊。

聯合體:

聯合體的長度至少是其內元素的最大值,成員是共享一段記憶體空間的。總結歸納有兩條原則:

1、首先聯合體的長度至少為最大成員的長度值。

2、最後確定的長度必須能夠整除所有的成員型別(注意char[19],其型別長度為1而不是19),即求它們的最小公倍數。

如有不足,歡迎批評指正。

相關推薦

結構聯合體記憶體分佈總結

 結構體記憶體分佈三大原則: 原則1:資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數

結構聯合體相關知識總結

1.結構體和陣列都是聚合資料型別,它們之間有以下的區別: 陣列是同種型別元素的集合,而結構體是相同或者不同的資料元素的集合。 陣列名在傳參時會退化為一個指標,但是結構體在作為函式引數時不會發生退化。 陣列可以通過下標來訪問某個元素,而結構體是

C指標之結構聯合體

1、結構體基礎知識   聚合資料型別(aggregate data type)能夠同時儲存超過一個的單獨資料。C語言提供了兩種型別的聚合資料結構,陣列和結構體。   陣列是相同型別的資料元素的集合,它的每個元素都是通過下標引用或者指標間接訪問來選擇的;結構也是一些值的集合,這些值稱為它的成

C指針之結構聯合體

第一個 test col 聚合 要求 拷貝 破壞 存儲位置 字節 1、結構體基礎知識   聚合數據類型(aggregate data type)能夠同時存儲超過一個的單獨數據。C語言提供了兩種類型的聚合數據結構,數組和結構體。   數組是相同類型的數據元素的集合,它的每個元

結構成員的記憶體分佈與對齊

我們先看一道IBM和微軟的筆試題: IBM筆試題: struct{  short   a1; short   a2;  short   a3;  }A;  struct{  long &n

結構聯合體

原來 作用 變量 結構體 spa str 空間 union 它的 定義: 結構體是將不同的數據類型組成一個新的數據類型(自定義數據類型) 聯合是幾個不同的數據類型共用同一個內存段(相互覆蓋) 所占內存大小: 結構體變量所占內存長度是各成員占的內存長度的總和。 共同體所占內存

結構聯合體的區別——全網最佳文章

聯合體 用途:使幾個不同型別的變數共佔一段記憶體(相互覆蓋) 結構體是一種構造資料型別 用途:把不同型別的資料組合成一個整體-------自定義資料型別   總結: 宣告一個聯合體: [cpp] view plaincopy union 

結構聯合體的位元組對齊問題

為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的 聯合體: 聯合體的記憶體不會為了所有成員安排,而是隻取最大的成員的所需記憶體大小,每次只能使用其中一個成員。但是有一個問題: typedef union { char a; int[5] b;

資料結構預備知識之指標,結構動態記憶體的分配與釋放

資料結構的整體框架: 資料結構只解決儲存問題,演算法解決操作問題。演算法依附於儲存結構,儲存不同,演算法不同。 衡量演算法的標準: 時間複雜度:執行的次數而非時間空間複雜度:佔用的記憶體難易程度健壯性 1.預備知識之指標 記憶體是CPU唯一可以直接訪問的大容量儲存區域,

結構聯合體 的區別

struct和union都是由多個不同的資料型別成員組成; 同一時刻,struct中的資料成員可以都存在,union中的資料成員只能存放被選中的那個; struct的大小是所有資料成員的大小之和,union的大小等於其資料成員中最大的那個; 對於union的不同成員賦值,將

C語言系列(六)結構聯合體

結構體 在C語言中,可以使用結構體(Struct)來存放一組不同型別的資料。結構體的定義形式為: struct 結構體名{ 結構體所包含的變數或陣列 }; 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每

我計算結構聯合體大小的方法

#include <stdio.h> struct A { int i; char ch[9]; }; void main() { struct A a

C 語言結構共用聯合體

本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,

結構聯合體位斷的記憶體對齊問題

記憶體對齊的原因: 1.平臺原因    不是所有硬體平臺都可以訪問任意地址上的任意資料;    某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。 2.效能原因   資料結構(尤其是

C++ 結構所佔記憶體大小

結構體存在記憶體對齊,類(物件)也如此,甚至於所有變數在記憶體中的儲存也有對齊一說(只是這些對程式設計師是透明的,不需要關心)。實際上,這種對齊是為了在空間與複雜度上達到平衡的一種技術手段,簡單的講,是為了在可接受的空間浪費的前提下,儘可能的提高對相同運算過程的最少(快)處理。先舉個例子:     假

淺談c++結構共用的區別

ont 基本類型 erl list 變量名 ext 使用結構體 oot 數據格式 在c++中,結構體(struct)和共用體(union)是兩種很相似的復合數據類型,都可以用來存儲多種數據類型,但是兩者還有很大的區別。 結構體(struct) 結構是用戶自定

結構連結串列陣列指標不同表達形式

int getMaxLengthOfItems(MEC_MENU *menu,int count){     int i;     int maxLen = strlen(menu[0].item);     for(i = 0; i < c

C#結構類區別聯絡

結構體 結構體定義 結構體是一種值型別,通常用來封裝小型相關變數組。例如座標或者商品的特徵。 結構體是一種自定義的資料型別,相當於一個複合容器,可以儲存多種型別。 結構體由結構體成員構成,結構體成員包含欄位,屬性與方法 結構體建

C#結構類的區別

結構體和類同樣能夠定義欄位,方法和建構函式,都能例項化物件,這樣看來結構體和類的功能好像是一樣的了,但是他們在資料的儲存上是不一樣的C#結構體和類的區別問題:這兩種資料型別的本質區別主要是各自指向的記憶體位置不同。傳遞類的時候,主要表現為是否同時改變了源物件。1.結構體是值型

【知識積累】C#結構類的區別

【類】     類是對現實生活中一類具有共同特徵的事物的抽象。類的實質是一種資料型別,類似於int、char等基本型別,不同的是它是一種複雜的資料型別。因為它的本質是型別,而不是資料,所以不存