結構體的記憶體對齊規則

2021-10-05 05:17:32 字數 1178 閱讀 3895

前言

結構體是一種自定義型別,其中包含了許多不同型別的變數,我們稱這些值為成員變數,那麼這種自定義型別的大小該怎麼計算呢?這才是我們今天討論的重點問題。

要想計算結構體的大小,首先得了解結構體的記憶體對齊規則。

對齊數 = 編譯器預設的對齊數(vs為8、linux為4) 與 該成員大小的較小值

下面我們看兩個例子:

計算結構體大小的時候,為什麼會存在結構體的記憶體對齊規則呢?

總的來說結構體內存對齊就是以空間時間的做法

我們通過兩個例子來理解不同設計的區別:

設計一:

typedef

struct testtest;

printf

("%d\n"

,sizeof

(test)

); 執行結果:12

設計二:

typedef

struct testtest;

printf

("%d\n"

,sizeof

(test)

); 執行結果:8

我們既要滿足對齊又要節省空間,所以讓占用空間小的成員盡量集中在一起函式傳參的時候,引數是需要壓棧的,會有時間和空間上的系統開銷

如果傳遞乙個結構體物件的時候,結構體過大,引數壓棧的系統開銷比較大,所以會導致效能的下降。

結構體傳參的時候需要傳結構體的位址

結構體在對齊方式不合適的時候,我們通過乙個巨集可以更改預設對齊數。

#pragma pack(對齊數):設定預設對齊數

#pragma pack( ):取消設定的預設對齊數,還原為系統預設對齊數。

結構體對齊規則

結構體對齊 pragma pack 4 結構體的長度 sizeof 乙個沒有考慮周詳的位段結構體中,可能存在大量 縫隙 1.實際對齊值決定系統一次劃分記憶體的位元組數量。系統為變數分配記憶體時,必須先劃分夠變數資料型別需要的對齊空間 對齊模數,位元組單位 2.結構體的實際對齊值為結構體中最大的資料型...

結構體對齊規則

結構體對齊規則 1 第乙個成員在與結構體變數偏移量為0處 2 其他成員變數需要對齊到某個數字 對齊數 的整數倍的位址處 對齊數 編譯器預設的乙個對齊數與該成員大小的較小值 vs中預設為8 3 結構體總大小為最大對齊數 每個成員變數除了第乙個成員都有乙個對齊數 的整數倍 4 如果巢狀了結構體的情況,巢...

結構體對齊規則

結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 每乙個元素放置到記憶體中時,它都會認為記...