gpt4 book ai didi

c - C 中的结构成员排序优势

转载 作者:行者123 更新时间:2023-12-03 17:12:09 25 4
gpt4 key购买 nike

我知道在 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 之前声明)。

我指的是需要完成内存访问“成本”或周期才能读/写结构成员和/或任何其他相关的考虑因素?

它是否依赖于编译器/架构(如果有的话)?

干杯,

家伙。

最佳答案

第一个版本和最后一个版本之间应该没有什么区别。在这两个结构中,int 成员在字边界上对齐,因此可以有效地从内存中读取它们。它们之间唯一的区别是,在 MyStructV1 中填充位于 cb 之间,在 MyStructV2 中填充在结构的末尾。但不会因为填充而产生执行开销;访问结构体成员只需将已知偏移量添加到结构体开头的地址即可完成。在 MyStructV1 中,b 的偏移量为 8,在 MyStructV2 中为 4

关于c - C 中的结构成员排序优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46742247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com