编译器如何在 struct 中完成内存分配? [复制]

Posted

技术标签:

【中文标题】编译器如何在 struct 中完成内存分配? [复制]【英文标题】:how is memory allocation done in struct by compiler? [duplicate] 【发布时间】:2014-01-08 12:18:30 【问题描述】:

考虑到int占用4个字节,char占用1个字节,下面结构占用的大小应该是9 [ 4 + 1 + 4 ],但实际上是12个字节[ 4 + 4 + 4 ]。

原因char y保留4字节内存,y占用1字节,其余3字节未使用。

struct some_struct 
    int x;
    char y;        
    int z;
;

问题 1: 那么为什么编译器会这样呢? (假设我有一个 X8086 架构)

问题2:如果它是一个联合(不是结构)怎么办?


非常感谢大家的回答,我意识到我应该只在发布问题之前在 SO 上搜索它。

【问题讨论】:

1.因为对齐。 2. 如果你有一本好书呢? 这个问题经常出现。我发现了一个这样的副本。答案是padding。 结构中为什么会出现日期类型的填充,是因为代码的访问效率。有关详细信息,请参阅en.wikipedia.org/wiki/Data_structure_alignment。不能使用 union 代替,因为它的作用与 struct 不同,除非您真的想要 union 的作用,即在同一 mememoy 位置重叠所有成员。 @ac_c0der 你真的是说8086吗? AFAIR,8086 是 16 位,所以我猜,填充(如果有的话)将是 2 个字节,而不是 4... 【参考方案1】:

您要查找的术语是padding。它在很大程度上取决于架构。一些架构支持“打包”结构。

除非给定机器上的编译器明确说明使用了哪种填充,否则无法做出任何假设。 C/C++ 标准没有定义。

填充量通常取决于当前和下一个字段的大小。如果第一个字段为 1 个字节,第二个为 4 个字节,则第一个字段将填充 3 个字节。这与变量寻址问题有关 - 有时无法在非 %4==0 地址上分配四字节变量。即使有可能 - 它也可能会引入额外的开销并使代码运行速度变慢,因此默认情况下通常不会这样做。 #pragma pack 可以改变 VS 中的行为。

Union 是完全不同的野兽。它为所有成员使用相同的内存。它的大小通常等于其最大成员的大小。其他成员根本不会使用它的所有内存。

【讨论】:

“有时无法分配...”对 - 或者不对齐的成本更高(它的软版本)。【参考方案2】:

对于您的第一个问题,请参阅此 [a link] (http://www.avabodh.com/cin/structure.html),对于第二个问题,请参阅此a link。

【讨论】:

【参考方案3】:

对于 struct:其元素按照它们在结构中声明的顺序分配。它将每个成员放在单独的内存中,位于一个连续的区域中。请参阅How are C struct members allocated? 了解更多信息。

对于union,顾名思义,定义了一个结构,其中所有成员占用相同的内存空间。查看Unions versus structures in C 获取示例。

【讨论】:

以上是关于编译器如何在 struct 中完成内存分配? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

new与malloc的区别struct与class的区别

如何在模板类函数中分配struct值?

C++ Struct 动态内存分配

Swift中结构体的方法调度&内存分区

C如何将struct分配给struct?

iOS程序中的内存分配 栈区堆区全局区(转)