簡體   English   中英

打包結構中的未打包結構是否自動打包?

[英]Are unpacked struct in packed struct automatically packed?

GCC自動打包打包結構中的解包結構嗎?

換句話說, __packed__屬性會自動傳播到嵌套結構嗎?

也就是說:

struct unpackedStruct{
    int16_t field1;
    int32_t field2;
    // etc...
}

struct packedStruct{
    int16_t field1;
    struct unpackedStruct struct1; // <-- Is this struct packed?
    // etc...
} __attribute__((__packed__));

不,內部結構沒有打包。 這個 Godbolt 示例中,我們可以看到struct foo沒有打包在struct bar內部,它具有packed屬性; 創建的struct bar object 在其struct foo成員內包含三個字節的填充(可見為.zero 3 ),在struct foo成員ci之間。

GCC 10.2 的當前文檔明確指出壓縮結構的成員的內部布局未壓縮(因為外部結構上的屬性;當然,它可以根據自己的定義進行壓縮)。

(在較早的文檔中說將packed應用於結構等同於將其應用於其成員,這意味着將packed應用於作為成員的“變量”的效果,在變量屬性的文檔中進行了描述。應用packed時對於結構成員,它會導致成員的 alignment 要求為一個字節。也就是說,它消除了先前成員和該成員之間的填充,因為不需要填充來使其對齊。它不會改變成員本身的表示。如果該成員是一個解壓結構,它在內部仍然是一個解壓結構。)

實際上它沒有:請參閱https://godbolt.org/z/4YMaz8 注意unpackedStruct成員的兩個成員之間的.zero 2填充。

手冊中明確提到了這種情況,示例與您的示例幾乎相同:

在以下示例中struct my_packed_struct的成員緊密地打包在一起,但其s成員的內部布局沒有打包——為此, struct my_unpacked_struct需要打包。

struct my_unpacked_struct
 {
    char c;
    int i;
 };

struct __attribute__ ((__packed__)) my_packed_struct
  {
     char c;
     int  i;
     struct my_unpacked_struct s;
  };

基本思想是給定類型的每個 object 應該具有相同的布局,以便在該類型上運行的代碼將適用於該類型的每個 object。 所以packed必須適用於一個type ,你不能有一些該類型的對象被打包,而另一些則沒有。

否 - 打包不是遞歸的,因此每個成員都需要自己打包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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