数据设计:更好地嵌套结构或指向结构的指针?

Tyl*_*den 1 c struct pointers data-structures

在普通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;
Run Code Online (Sandbox Code Playgroud)

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

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

哪种方法更可取?

Mat*_*ira 5

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

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

指针提供了您可能不希望使用的其他语义。他们:

  • 可以为NULL,表示数据不可用或可能是可选的
  • 在单独的结构之间创建链接,并允许一个结构不存在另一个结构
  • 允许对两个不同的结构进行不同的分配并具有不同的生存期
  • 允许许多不同的结构共享一个可能很大的通用嵌套值,而不会浪费内存
  • 让您指向尚未正确定义的数据
    • 您可以指向不透明结构,该结构无法在堆栈中实例化,因为编译器尚不知道它们的大小