我知道在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 –
它依赖于编译器。除此之外,一个非常好的经验法则是不要担心打包结构,除非你有一些体系结构和编译器特定的理由来这样做,并确切知道它是什么。否则,让编译器处理它并在它认为合适的地方插入一个或两个填充符会更好。 –