關於結構體以及聯合體變數大小,記憶體對齊的理解

2021-09-26 19:11:50 字數 1372 閱讀 8407

記憶體對齊在不同位數的機器上的 對齊位元組數是不同的

在32位的機器上預設記憶體對齊的位元組數為4個位元組,在64位的機器上預設的記憶體對齊的位元組數為8位元組。

如以下**

struct s1

;

sizeof(struct s1) =16;

它是怎麼對齊的呢?如下圖:

在記憶體中首先填入變數a,變數a是int型變數在記憶體中佔據四個位元組。示意圖中紅色部分代表a的儲存。然後存入變數b,char型別佔據乙個位元組,黃色部分代表b的儲存。藍色數陣列c的 儲存每個元素佔據乙個位元組。到最後正好由陣列c填充。正好構成記憶體對齊。

這種情況是比較簡單的情況。

接下來我們把結構體成員的位置換一下位置。

**如下:

struct s2

;

現在這個結構體的大小已經變化成20;

記憶體儲存情況如下:

一開始,先儲存變數b,佔據乙個位元組紅色部分所示。接下來要儲存變數a,要佔據4個位元組。但是,在記憶體對齊為4個位元組的情況下,變數a是不能從位址1的位置開始儲存的,只能從位址4的位置開始儲存。那麼剩下的1、2、3,就會自動填充,使其不為空。所以,在儲存時,黃色為變數a儲存部分。然後儲存陣列c,一直到位址18的位置。到這個位置,結構體中成員的位元組數已經儲存完了,但由於記憶體對齊機制,還需要補上一位,讓整個位址空間是最大資料成員的整數倍。而且,存放的起始位址必須是該型別大小的整數倍。s3、s4提現了這一點。

struct s3

;

這個結構體可以實現體現出:

接下來的結構體**

struct s4

;

儲存形式為

以上無顏色填充部分皆為系統自動填充的資料空間。

總結:1.結構體大小是其中最大基本資料成員的整數倍

2.由於記憶體對齊機制的存在,結構體成員位置會影響結構體大小

對於聯合體的大小,要保證的是至少能容納最大的成員變數,而且要滿足所有資料成員基本型別的整數倍。

結構體聯合體

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

聯合體結構體型別大小判斷

根據現有的各種資料,c c 中聯合體型別在記憶體中的大小預設以最長的為準,並以長度最長的型別對齊。按照上述原則 union a 在記憶體中所佔位元組數應為sizeof int 5 並使其以sizeof double 對齊,在32位或者64位系統平台上,sizeof a 的值應為24.不過程式 inc...

關於結構體 聯合體 類的大小比較

在實際專案中,結構體和其他型別基礎 資料型別 一樣,結構體是大量存在的。結構體的大小不是結構體元素單純相加就行的,需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式如下 1.每個成員的偏移量都必須是當前成員所佔記憶體大小的整數倍,否則在成員之前加上偏移量 2.當前所以成員大小計算完畢,編譯器判...