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)
这里我们有一些嵌套的结构,在某些情况下,嵌套指向内部结构的指针,而在另一些情况下,则嵌入结构本身。
除了对齐和取消引用之外,还有一个问题是如何分配内存。如果我不使用指针,而是使用纯嵌套结构,则在分配该结构的实例时,将在一步中分配整个嵌套树(并且还必须在一步中将其释放)。但是,如果使用指针,则必须分别分配和释放内部成员,这意味着更多的代码行,但可能会有更大的灵活性,因为例如,如果记录中没有该字段的值,则可以使成员为空。
哪种方法更可取?
嵌套结构可确保其空间位置,因为整个对象实际上是一个很大的内存块,即使它是由多个结构组成的;在内存中,该树被展平并且所有成员都连续存储。这可能会更好地利用快速内存,例如处理器缓存。如果将指针嵌套到其他结构,则此间接级别可能意味着嵌套的数据存储在较远的位置,这可能会阻止此类优化;通过取消引用指针,必须从主存储器中获取数据。直接嵌套数据还简化了出于序列化和传输之类的结构成员的访问。
它还具有其他含义,例如对结构大小的影响以及按值传递其对象的影响。如果直接嵌套结构,则sizeof结构可能比嵌套指针大得多。较大的结构具有较大的内存占用量,如果一直在进行复制,则内存占用量会明显增加。如果对象不是不透明的,则可以将它们分配在堆栈上并快速将其溢出。结构越大,它们越适合用于动态分配和通过指针的间接访问。我推测围绕大量数据进行复制也会带来速度上的损失,但我不确定。
指针提供了您可能不希望使用的其他语义。他们:
NULL,表示数据不可用或可能是可选的