如何通过编译器在struct中完成内存分配?

时间:2014-01-08 12:18:31

标签: c++ c memory-management compiler-construction struct

考虑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上搜索它。

4 个答案:

答案 0 :(得分:2)

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

除非给定机器上的编译器明确说明使用何种填充,否则不能进行任何假设。 C / C ++标准没有定义它。

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

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

答案 1 :(得分:0)

前段时间我发现这篇文章非常有用:

http://www.roguewave.com/portals/0/products/threadspotter/docs/2011.2/html_doc/manual_html/ch05s01.html

请查看“5.1.3。对齐问题”部分 - 它解释了为什么编译器使用对齐和填充。

还有一件事很不错 - 处理很多不良对齐的结构会降低程序的性能。原因在于,随着结构在内存中占用更多空间,其中较少数量的空间可以适合单个缓存行。对结构字段进行简单的重新排序可以提高执行速度(减少高速缓存读取)。

答案 2 :(得分:0)

第一个问题请参阅[链接](http://www.avabodh.com/cin/structure.html),第二个问题请参阅a link

答案 3 :(得分:0)

  • 对于 struct :其元素按照结构中声明的顺序进行分配。它将每个成员放在一个单独的连续区域中。有关详细信息,请参阅How are C struct members allocated?

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