gpt4 book ai didi

c - 数据设计: better to nest structures or pointers to structures?

转载 作者:太空宇宙 更新时间:2023-11-04 00:37:23 26 4
gpt4 key购买 nike

在纯 C 中工作,将结构嵌套在其他结构或指向结构的指针中更好。使用指针可以更容易地实现良好的对齐,但是访问内部结构需要额外的取消引用。只是具体地说:

typedef struct {
unsigned int length;
char* string;
} SVALUE;

typedef struct {
unsigned int key;
SVALUE* name;
SVALUE* surname;
SVALUE* date_of_birth;
SVALUE* date_of_death;
SVALUE* place_of_birth;
SVALUE* place_of_death;
SVALUE* floruit;
} AUTHOR;

typedef struct {
SVALUE media_type;
SVALUE title;
AUTHOR author;
} MEDIA;

这里我们有一些嵌套结构,在某些情况下嵌套指向内部结构的指针,而在其他情况下嵌入结构本身。

除了对齐和取消引用之外,还有一个问题是内存的分配方式。如果我不使用指针,而使用纯嵌套结构,那么在分配结构实例时,整个嵌套树一步分配(也必须一步释放)。但是,如果我使用指针,那么我必须分别分配和释放内部成员,这意味着更多的代码行但可能更灵活,因为例如,如果记录对该字段没有值,我可以将成员保留为 null。

哪种方法更可取?

最佳答案

嵌套结构确保它们的 spatial locality ,因为整个对象实际上只是一大块内存,尽管它由多个结构组成;在内存中,树被展平,所有成员都被连续存储。这可能会导致更好地使用快速内存​​,例如处理器高速缓存。如果嵌套指向其他结构的指针,这种间接级别可能意味着嵌套数据存储在较远的位置,这可能会阻止此类优化;通过取消引用指针,必须从主内存中获取数据。为了序列化和传输等目的,直接嵌套数据还简化了结构成员的访问。

它还有其他含义,例如对结构大小的影响以及按值传递其对象的影响。如果您直接嵌套结构,sizeof 您的结构可能会比嵌套指针大得多。更大的结构有更大的内存占用,如果一直在制作副本,内存占用会显着增加。如果对象不是不透明的,它们可以在栈上分配并快速溢出。结构越大,它们越适合动态分配和通过指针间接访问。我推测复制大量数据也会带来速度成本,但我不确定。

指针提供了额外的语义,在您的情况下可能需要也可能不需要。他们:

  • 可以是NULL,表示数据不可用或者可能是可选的
  • 在不同的结构之间建立联系,并允许一个结构独立存在
  • 允许两个不同的结构以不同方式分配并具有不同的生命周期
  • 允许许多不同的结构共享一个可能很大的公共(public)嵌套值而不浪费内存
  • 让您指向尚未正确定义的数据
    • 你可以指向不透明的结构,它不能在栈中被实例化,因为编译器还不知道它们的大小

关于c - 数据设计: better to nest structures or pointers to structures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414103/

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