1. 程式人生 > >結構體和聯合體的位元組對齊問題

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

為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的

聯合體:

聯合體的記憶體不會為了所有成員安排,而是隻取最大的成員的所需記憶體大小,每次只能使用其中一個成員。但是有一個問題:

typedef union
{
  char a;
  int[5] b;
  double c;
}

當然只取最大的int陣列的大小20沒錯,但是double8位元組的,而此時聯合體已經按int4位元組對齊了,所以還要額外多加4位元組的記憶體來保證8的倍數。所以最後結果是24

所以聯合體的記憶體除了取最大成員記憶體外,還要保證是所有成員型別size的最小公倍數

結構體

結構體則會包含所有成員的記憶體。按成員的定義順序依次分配,當輪到某一個成員時,如果此時的記憶體偏移量不是該成員所需記憶體的倍數時,則需要擴充到滿足為止。所有成員都分配完後,如果此時記憶體塊大小不是最大成員的大小的倍數時,也需要擴充。

typedef struct
{
  int a;
  double b;
  char c
}

首先偏移量0int大小(4)的倍數,因此直接分配,然後因為偏移量4不是double大小(8)的倍數,所以先擴充再分配,接著因為偏移量16char大小(1)的背書,所以直接分配。最後因為總大小17不是8的倍數,所以再擴充到24

相關推薦

更改結構的記憶體位元組方式--經典

為什麼要對齊?     現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何地址開始,但實際情況是在訪問特定型別變數的時候經常在特定的記憶體地址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。     對齊的作用和原因:

結構聯合體位元組問題

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

Windows下structunion位元組設定以及大小的確定(一 簡介結構大小的確定)

在windows下設定位元組對齊大小的方式,目前我瞭解有三種: 1. 在編譯程式時候的編譯選項  /Zp[n],如 cl /Zp4 表示對齊大小是4位元組; 2. 預處理命令   #pragma pack( [ show ] | [ push | pop ] [, ide

3.c語音結構成員內存詳解

定義 pre 形狀 sed 兩個 分配 我們 替代 images 一.關鍵一點 最關鍵的一點:結構體在內存中是一個矩形,而不是一個不規則形狀 二.編程實戰 1 #include <stdlib.h> 2 #inc

上、下位機軟件通信時,結構的內存問題

代碼 ini tle www. init 軟件 。。 === 默認 嵌入式開發,上位機軟件與下位機軟件通信發送結構體數據時,由於兩者 IDE 通常不同 (因此編譯器通常也不同),導致上下位軟件各自編譯器的默認 “對齊系數” 也可能不同。 此時需在代碼中指定一個一致的 “對齊

C指標之結構聯合體

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

C指針之結構聯合體

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

結構的大小 記憶體

結構體的大小 記憶體對齊   Struct A {    int a;    int b; };  int main() { Printf(“%d\n”,sizeof(struct A)); 共佔8位

結構的大小,規則

每個成員的偏移量必須是該成員大小的倍數 結構體的大小是最大成員的倍數 基本型別資料對齊就是資料在記憶體中的偏移地址必須等於一個字的倍數,     按這種儲存資料的方式,可以提升系統在讀取資料時的效能。為了對齊資料,     可能必須

結構聯合體

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

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

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

c語言結構巢狀的方式

1:在程式碼中有結構體巢狀的方式,又需要獲取每個變數的地址。那麼需要了解結構體巢狀和單一結構體的一些對齊方面的規則。2:對於嵌入式的裝置來說,對齊很重要,有些cpu不支援不對齊的訪問方式,有的cpu支援,只是效率上會降低。3:arm中預設編譯的時候會進行對齊。規則一:結構體中

結構聯合體相關知識總結

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

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

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

結構聯合體 的區別

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 構造型別 陣列、列舉、聯合體結構(位段) 位元組 大小端儲存

列舉 .列舉:被命名的標籤常量(對事物的列出) ---型別的構造------- enum key{    UP,                             //成員<標籤常量:預設第一個為0 後一個總是前一個的值加一>    DOWN,    L

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

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

C語言 結構位元組問題

摘選自這位大神的部落格 方法一: 結構體在記憶體中分配一塊連續的記憶體,但結構體內的變數並不一定是連續存放的,這涉及到記憶體對齊。原則1  資料成員對齊規則:結構(struct或聯合union)的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整