簡體   English   中英

c結構的64位對齊/填充?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM