我的追求是關於結構填充?任何人都可以告訴我結構填充的邏輯是什麼。結構填充如何工作?
實施例:
結構節點{ char c1;
short s1;
char c2;
int i1;
};
任何一個可以告訴我,結構填充將如何運用這種結構?
假設:整數需要4字節。
等待答案。
我的追求是關於結構填充?任何人都可以告訴我結構填充的邏輯是什麼。結構填充如何工作?
實施例:
結構節點{ char c1;
short s1;
char c2;
int i1;
};
任何一個可以告訴我,結構填充將如何運用這種結構?
假設:整數需要4字節。
等待答案。
填充的工作方式完全取決於實現。
對於您有兩個字節short
和四字節int
和類型必須對齊其大小的多種實現,你將有:
Offset Var Size
------ ---- ----
0 c1 1
1 ?? 1
2 s1 2
4 c2 1
5 ?? 3
8 i1 4
12 next
的實現可以自由插入填充無論出於任何原因,在結構的字段之間並且跟隨最後一個字段(但是在第一個字段之前的而不是)之後。填充結構之後的能力對於對齊數組中的後續元素很重要。例如:
struct { int i1; char c1; };
可能會給你:
Offset Var Size
------ ---- ----
0 i1 4
4 c1 1
5 ?? 3
8 next
填充通常是這樣做,因爲無論是對齊的數據工作更快,或錯位的數據是非法的(一些CPU架構不允許對齊的訪問)。
感謝您的詳細解釋。 – hims 2013-12-19 10:37:15
有沒有簡單的答案,除了「這取決於」。
它可以是少至8個字節,假定兩個字節短褲,或它可能需要12個字節,或者它可以採取適當奇異實現42個字節。它至少取決於底層架構,編譯器和編譯器標誌。查看您的工具手冊以獲取信息。
裏面一個結構中,每個構件在存儲器的偏移是基於它們的大小和取向。請注意,這是特定實施方案
E.g.如果需要char
1個字節,short
佔用2個字節和int
需要4個字節:你的編譯器的設置和結構
structure Node{
char c1; // 1 byte
// 1 byte padding (next member requires 2 byte alignment)
short s1; // 2 bytes
char c2; // 1 byte
// 3 bytes padding (since next member requires 4 byte alignment)
int i1; // 4 bytes
};
這也取決於,並且也可以被修改。
如果妥善包裝該結構(通過重新排列成員的順序),即可裝配成8個字節,而不是12個字節(通過用S1切換C2)。
對齊強制執行的原因是,硬件可以使用自然對齊的數據更快地執行某些操作;否則在操作數據之前,必須執行一些位屏蔽,移位和ORing操作來構造數據。
https://stackoverflow.com/questions/29813803/structure-padding/45198135#45198135在上面的鏈接中查看Govind的答案 – Govind 2017-07-19 18:23:22