结构体元素的内存分配

3

我读到过结构体成员不需要在内存中连续。这是不是意味着它们可以像不同的变量一样位于内存中的任意位置?如果是这样,那么为结构体分配空间使用malloc会浪费很多存储空间吗?


如果一个结构体有两个成员A和B,那么只要编译器或程序员在它们之间不添加填充,A和B就会是连续的。 - arunmoezhi
@wallyk:你说得对。我重新表达了我的评论。 - arunmoezhi
@arunmoezhi:好的,我已经删除了我的评论。 - wallyk
2个回答

3
根据CPU架构的不同,结构成员正确对齐可能是必要的,例如4字节成员的地址应该能被4整除。一些CPU不需要这样的对齐,但很多需要。一些CPU在尝试处理未对齐的数据时会崩溃,其他的则可以处理,但访问未对齐的数据将会更慢。
汇编程序员需要关注这个问题,但C程序员通常可以将混乱的细节留给编译器。这意味着结构可以包含“隐形”填充来确保正确对齐。这种填充并不浪费太多空间,并且可以通过良好的结构成员布局将浪费空间最小化。请注意,这种填充也会出现在为函数创建的堆栈变量中。
有关更多信息,请参见数据结构对齐

3

尽管 struct 成员不一定是连续的,但它们也不会出现在任意的内存位置。例如,考虑以下定义:

struct MyStruct
{
    char foo;
    int  bar;
};

假设sizeof(int) == 4,那么foo将位于偏移量0处,bar将位于偏移量4处(为了正确对齐)。因此整个结构体将占用8字节,尽管它可以在5字节内完成。但是,这些偏移量将始终对于结构的每个实例相同。因此回答你关于malloc的问题,不会浪费空间。
至于单独的变量,是的,它们可能位于内存中的不同位置,但结构体的整个目的是将相关变量分组。因此,同一结构体实例的所有成员都将紧密地组合在一起。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接