编译器如何在 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 中完成内存分配? [复制]的主要内容,如果未能解决你的问题,请参考以下文章