從here
第一元件是char這是一個字節對齊,接着短 INT。短整型是2個字節對齊。如果short int元素是在char元素後立即分配的 ,它將從奇數 地址邊界開始。編譯器會在 字符後面插入一個填充字節,以確保短整型將具有2的地址倍數(即2 字節對齊)。
這是你的結構看起來的樣子:
+-------+-------+-------+-------+
| Data1 | | Data2 |
+-------+-------+-------+-------+
| Data3 |
+-------+-------+-------+-------+
| Data4 | | | |
+-------+-------+-------+-------+
所以填充從焦炭到short
是一個字節=>
268624到268625的數據1,從268625到268626填充到short
。 然後268626到268628 short
不需要填充,全部對齊到結構的最大類型。
,從同樣的參考
有一種方法以最小化填充。程序員應該在大小
他們增加/減少命令,宣佈該 結構成員,以提高你的結構方式是char Data1;
這樣沒有內存將被浪費的填充後直接放置char Data4;
:
struct MixedData
{
char Data1;
char Data4;
short Data2;
int Data3;
}md;
printf("%p %p %p %p", &md.Data1,&md.Data4, &md.Data2, &md.Data3);
0x602270 0x602271 0x602272 0x602274
基本假設,即編譯器堅持自然對齊的int在x86上
爲什麼只有2個字節在短之前使用不是4? –
但如果我在你的答案中聲明瞭兩個連續的'char',那麼爲什麼不需要填充? –
在這種情況下,你的結構是對齊的,並且不需要填充。你的情況中填充了什麼?在Data1之後添加一個字節以將char對齊。 Data1 + Data4 = 2個字符,2個字符= 2個字節,短兩個字節對齊,不需要額外的填充 – Dabo