考虑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上搜索它。
答案 0 :(得分:2)
您正在寻找的术语是padding。它在很大程度上取决于架构。一些架构支持“打包”结构。
除非给定机器上的编译器明确说明使用何种填充,否则不能进行任何假设。 C / C ++标准没有定义它。
填充量通常取决于当前和下一个字段大小。如果第一个字段大1个字节,第二个字节是4个字节,则第一个字段将填充3个字节。这与变量寻址问题有关 - 有时无法在非%4==0
地址上分配四字节变量。即使可能 - 它可能会引入额外的开销并使代码工作得更慢,因此通常默认情况下不会这样做。 #pragma pack可以改变VS中的行为。
联盟是一个完全不同的野兽。它为所有成员使用相同的内存。它的大小通常等于其最大成员的大小。其他成员根本不使用它的所有内存。
答案 1 :(得分:0)
前段时间我发现这篇文章非常有用:
请查看“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示例。