[英]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
成員c
和i
之間。
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.