结构元素的内存分配

时间:2014-10-07 04:01:46

标签: c

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

2 个答案:

答案 0 :(得分:3)

根据CPU架构,可能需要正确对齐结构成员,例如,4字节成员的地址应该可以被4整除。有些CPU不需要这样的对齐,但是很多都可以。如果您尝试使用不正确对齐的数据执行操作,某些CPU将崩溃,其他CPU将会应对,但访问不正确对齐的数据会慢得多。

汇编程序员需要担心这个问题,但C程序员通常可以将混乱的细节留给编译器。但这意味着结构可以包括"隐形"填充以确保正确对齐。这种填充物不会浪费太多空间,您可以通过良好的结构构件布局来最小化浪费的空间。请注意,此填充也适用于在函数堆栈上创建的变量。

有关详细信息,请参阅Data structure alignment

答案 1 :(得分:3)

虽然成员不一定是连续的,但他们也不在任意的记忆位置。例如,采用以下定义:

struct MyStruct
{
    char foo;
    int  bar;
};

假设sizeof(int) == 4,则foo将位于偏移0处,bar位于偏移4处(正确对齐)。所以整个结构将是8个字节,即使它可以适合5个。但是,对于这个结构的每个实例,这些偏移总是相同的。所以回答你关于malloc的问题,不,它不会浪费空间。

就单独的变量而言,是的,它们可能位于内存中的不同位置,但结构的整个点是对相关变量进行分组。因此,同一结构实例的所有成员将紧密组合在一起。

相关问题