我知道在C語言中,struct成員的順序是它們聲明的順序加上(通常除非另有說明)否則可能發生填充,導致我創建的兩個第一個結構體他們各自的大小:在C語言中訂購優勢的結構成員
struct MyStructV1
{
int a;
char c;
int b;
};
printf("size of MyStructV1 is:%lu \n",sizeof(struct MyStructV1)); // prints 12
struct MyStructV1Packed
{
int a;
char c;
int b;
}__attribute__((__packed__));;
printf("size of MyStructV1Packed is:%lu \n",sizeof(struct MyStructV1Packed)); // prints 9
到目前爲止好。
那麼,我的問題是,下面的MyStructV2的「解壓縮」版本聲明與第一版MyStructV1相比有什麼優點/好處嗎?
struct MyStructV2
{
int a;
int b;
char c;
};
printf("size of MyStructV2 is:%lu \n",sizeof(struct MyStructV2)); // prints 12 as well
請注意,現在成員的順序有變化(b在c之前聲明)。
我指的是內存訪問「成本」或週期需要完成,以讀/寫結構成員和/或任何其他相關的考慮因素?
它是依賴於編譯器/架構(如果有的話)?
乾杯,
蓋伊。
大多數並不重要,在所有的時間。您可能希望在較短的區域之前放置更廣泛的區域。當然這取決於體系結構和ABI –
它依賴於編譯器。除此之外,一個非常好的經驗法則是不要擔心打包結構,除非你有一些體系結構和編譯器特定的理由來這樣做,並確切知道它是什麼。否則,讓編譯器處理它並在它認爲合適的地方插入一個或兩個填充符會更好。 –