記憶體對齊在不同位數的機器上的 對齊位元組數是不同的
在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.當前所以成員大小計算完畢,編譯器判...