2012-11-07 150 views
3
struct tag_t_ { 
    u_int8_t op; 
    u_int8_t num; 
    u_int32_t labels[5]; 
}; 

在上面的結構中,將由64位編譯器添加填充字節?
在第一個標籤之前還是在第一個標籤的末尾?
如果填充位於第一個標籤的末尾,是否會在訪問(讀取)32位拱形中的第一個標籤時導致任何錯誤的結果?c結構的64位對齊/填充?

回答

4

我在64位系統上運行這一點 - 該結構的存儲器映射

offset: variable 
    0: op num  
    2: 00 00 // only 2 paddings 
    4: label0 
    8: label1 
     ... 
    20: label5 

的sizeof(結構)== 24

//此處是一個可以容納一個無符號的短在字符和第一個32位整數之間,而不影響結構的大小。

結構填充的規則是任何寬度爲W的基本變量都將與該寬度對齊。兼作第二個參數會導致op後7個填充字節和只有3 num後填充字節,如標籤[0]然後將通過4.

在開始的偏移整除有32/64位系統之間的差:32位系統仍然會將8字節變量對齊到32位邊界。 64位系統將對齊long int和double對8字節邊界。

這將使安全在32位系統中使用該結構。如果結構中有雙打,那麼仍然可以通過仔細規劃變量來使結構兼容。

0

填充通常應用在每個字段的末尾。不,一個64位編譯二進制與32位二進制不兼容。所以你可能不得不重新編譯32位體系結構的所有內容。

然後將由32位編譯器照管對齊,並相應地生成地址。

4

這取決於編譯器,沒有通用的規則可以應用和保證。

我不確定後半部分的問題,因爲在32位體系結構中,編譯器當然會有所不同。直接轉移結構從來都不是好主意。

由於存在填充,如果在64位計算機上向某些外部介質寫入sizeof (tag_t_)字節,請傳輸介質並嘗試在32位計算機上讀取sizeof (tag_t_),則該操作將失敗。所以不要這樣做。按字段序列化結構,並以相同的方式對它們進行反序列化。

+0

除非tag_t_被打包 – iabdalkader

+0

+1用於拾取系統之間的傳輸結構,這是填充相關問題的主要原因。 – Lindydancer