帶有位域的結構,即使“打包”,似乎也根據指定的 int 型別來處理位域的大小(以及對齊方式?)。有人可以指出定義該行為的 C 規則嗎?我嘗試了十幾種編譯器和體系結構(謝謝,Compiler Explorer!),結果是一致的。
這是要玩的代碼:

uj5u.com熱心網友回復:
有人可以指出定義該行為的 C 規則嗎?
標準沒有#pragma pack(push, 1)指定任何內容(除了#pragma指定為具有實作定義含義的前處理器指令)。它是一種語言擴展。
這是標準對位欄位的規定:
[class.bit]
... 位域應具有整數或(可能是 cv 限定的)列舉型別;位域語意屬性不是類成員型別的一部分。...類物件內的位域分配是實作定義的。位域的對齊是實作定義的。位域被打包到一些可尋址的分配單元中。
它基本上完全是定義或未指定的實作。
uj5u.com熱心網友回復:
位域序列的最小大小是其基礎型別的大小。相同基礎型別的多個相鄰位域被打包到基礎型別的最小字數,而不會破壞任何位域。大小為 0 的位欄位表示顯式中斷,后續欄位從下一個字開始。混合基礎型別導致分歧點的突破。位不是大多數機器上的最小可尋址單元,并且資料型別的大小以八位位元組為單位測量,作為最小的可尋址記憶體單元。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/466810.html
上一篇:c 函式模板限制引數型別
下一篇:填充ROI的中心
