struct tag_t_ {
u_int8_t op;
u_int8_t num;
u_int32_t labels[5];
};
在上面的結構中,將由64位編譯器添加填充字節?
在第一個標籤之前還是在第一個標籤的末尾?
如果填充位於第一個標籤的末尾,是否會在訪問(讀取)32位拱形中的第一個標籤時導致任何錯誤的結果?c結構的64位對齊/填充?
struct tag_t_ {
u_int8_t op;
u_int8_t num;
u_int32_t labels[5];
};
在上面的結構中,將由64位編譯器添加填充字節?
在第一個標籤之前還是在第一個標籤的末尾?
如果填充位於第一個標籤的末尾,是否會在訪問(讀取)32位拱形中的第一個標籤時導致任何錯誤的結果?c結構的64位對齊/填充?
我在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位系統中使用該結構。如果結構中有雙打,那麼仍然可以通過仔細規劃變量來使結構兼容。
填充通常應用在每個字段的末尾。不,一個64位編譯二進制與32位二進制不兼容。所以你可能不得不重新編譯32位體系結構的所有內容。
然後將由32位編譯器照管對齊,並相應地生成地址。
這取決於編譯器,沒有通用的規則可以應用和保證。
我不確定後半部分的問題,因爲在32位體系結構中,編譯器當然會有所不同。直接轉移結構從來都不是好主意。
由於存在填充,如果在64位計算機上向某些外部介質寫入sizeof (tag_t_)
字節,請傳輸介質並嘗試在32位計算機上讀取sizeof (tag_t_)
,則該操作將失敗。所以不要這樣做。按字段序列化結構,並以相同的方式對它們進行反序列化。
除非tag_t_被打包 – iabdalkader
+1用於拾取系統之間的傳輸結構,這是填充相關問題的主要原因。 – Lindydancer