2012-03-30 61 views
0

我的追求是關於結構填充?任何人都可以告訴我結構填充的邏輯是什麼。結構填充如何工作?

實施例:

結構節點{ char c1; short s1; char c2; int i1; };

任何一個可以告訴我,結構填充將如何運用這種結構?

假設:整數需要4字節。

等待答案。

+0

https://stackoverflow.com/questions/29813803/structure-padding/45198135#45198135在上面的鏈接中查看Govind的答案 – Govind 2017-07-19 18:23:22

回答

1

填充的工作方式完全取決於實現。

對於您有兩個字節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架構不允許對齊的訪問)。

+0

感謝您的詳細解釋。 – hims 2013-12-19 10:37:15

0

有沒有簡單的答案,除了「這取決於」。

它可以是少至8個字節,假定兩個字節短褲,或它可能需要12個字節,或者它可以採取適當奇異實現42個字節。它至少取決於底層架構,編譯器和編譯器標誌。查看您的工具手冊以獲取信息。

0

裏面一個結構中,每個構件在存儲器的偏移是基於它們的大小和取向。請注意,這是特定實施方案

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操作來構造數據。