C 中結構體的對齊方式

2021-08-25 14:30:24 字數 1405 閱讀 9706

在面試中,常會考到結構體的對齊方式,因此對其進行總結。

1、在沒有#pragma pack巨集的情況下

struct sa;原則1:每個成員按型別的大小對齊,即相對於結構體位址的成員位址能被型別大小整除.並且結構體的大小(sizeof(a))必須為成員所含型別中最大值(sizeof(double))的整數倍,不夠就補空位元組.

例1:

例如用結構體定義物件a,其第乙個成員d1的型別為double,大小為8位元組,它的位址(也是a的位址)就需要能被4整除,這主要是因為為a申請記憶體時,其位址由其成員中所含的最大型別單獨申請記憶體的規則決定(a中最大型別為double),int和double型別在單獨申請記憶體時,其位址為4的整數倍。第二個成員i1的型別為int,大小為4位元組,它相對於結構體a位址(00bdf7ec)的成員位址(8)能被4整除,不需要補充空白位元組。第三個成員d2的型別為double,大小為8位元組,它相對於結構體a位址(00bdf7ec)的成員位址(12)不能被8整除,需要補充4個空白位元組。第四個成員c1的型別為char,大小為1位元組,它相對於結構體a位址(00bdf7ec)的成員位址(16)能被1整除,不需要補充空白位元組。

原則2:結構體作為成員,型別大小按其成員所含最大型別計算。

struct sb;例2:struct sb裡存有struct sa,其結構體成員sa1的型別大小按8位元組計算

原則3:結構體的總大小,為其成員中所含最大型別的整數倍。在例1中即為成員d1型別(double,8)的整數倍。而在例二中即為成員sa1型別(8)的整數倍。

2、在有#pragma pack巨集的情況下

(1)#pragma pack(1),例1和例2的情況如下

可以看到其成員均按1作為其型別大小進行對齊,結構體的總大小也為1的整數倍。

(2)#pragma pack(2),例1和例2的情況如下

可以看到其成員均按2作為其型別大小進行對齊,結構體的總大小也為2的整數倍。

(3)#pragma pack(4),例1和例2的情況如下

可以看到其成員均按4作為其型別大小進行對齊,結構體的總大小也為4的整數倍。

附上**

結構體對齊方式

對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失。語法 pragma pack show push pop identifi...

整數邊界對齊方式 c中結構體邊界對齊

原則1 普通資料成員對齊規則 第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始 比如int在32位機為 位元組,則要從4的整數倍位址開始儲存 原則2 結構體成員對齊規則 如果乙個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍位址...

結構體對齊方式詳解

1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 而對齊的記憶體訪問僅需要一次訪問...