[英]64 bit alignment/padding for c structure?
struct tag_t_ {
u_int8_t op;
u_int8_t num;
u_int32_t labels[5];
};
在上面的結構中,將由64位編譯器添加填充字節?
是在第一個標簽之前還是在第一個標簽的末尾?
如果填充位於第一個標簽的末尾,那么在訪問(讀取)32位拱中的第一個標簽時是否會導致任何錯誤結果?
這取決於編譯器,沒有可以應用並保證保持的通用規則。
我不確定問題的后半部分,因為在32位架構上,編譯器當然會有所不同。 直接轉移結構永遠不是一個好主意。
由於填充,如果您將sizeof (tag_t_)
字節寫入64位計算機上的某些外部介質,傳輸介質然后嘗試讀取32位計算機上的sizeof (tag_t_)
,它將失敗。 所以不要這樣做。 逐個字段地序列化結構,並以相同的方式對它們進行反序列化。
我在64位系統中運行它 - 結構的內存映射是
offset: variable
0: op num
2: 00 00 // only 2 paddings
4: label0
8: label1
...
20: label5
sizeof(struct)== 24
//這里可以在chars和第一個32位整數之間插入無符號的short,而不會影響struct的大小。
struct padding的規則是任何寬度為W的基本變量都將與該寬度對齊。 作為第二個參數的double將在op
之后導致7個填充字節,並且在num
之后僅導致3個填充字節,因為標簽[0]將在可被4整除的偏移處開始。
32/64位系統之間存在差異:32位系統仍將8字節變量與32位邊界對齊。 64位系統將長整數和雙字節對齊到8字節邊界。
這樣可以安全地在32位系統中使用該結構。 如果結構中有雙精度數,那么仍然可以使結構與仔細規划變量兼容。
填充通常應用於每個字段的末尾。 不,64位編譯二進制文件與32位二進制文件不兼容。 因此,您可能必須重新編譯32位架構的所有內容。
然后將通過32位編譯器處理對齊,並相應地生成地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.