为结构分配的内存

时间:2010-12-31 10:10:22

标签: c struct memory-alignment

我有结构

typedef struct EData
{
    int a;
    char c;
}
Edata obj;

a是整数变量,因此需要4个字节,c是char变量所以它需要 1个字节,总共5个字节

但是当我打印sizeof(obj)时,它会显示 8个字节

是什么原因?

4 个答案:

答案 0 :(得分:4)

因为在32位系统上,内存在4byte (32bit)边界对齐,所以它必须是4字节的倍数,请参阅Data structure alignment

答案 1 :(得分:3)

int是4个字节,char是1个字节。但是,您的编译器aligns each struct to a word(32位架构上的一个字是4个字节),因为它可以提高性能。因此,EData的每个实例将向上舍入为2个字(或8个字节)。

你最终得到的是这样的:

typedef struct EData {
    int a;
    char c;
    char padding[3];
}

答案 2 :(得分:1)

您注意到的大小增加是由于编译器的填充 编译器添加额外的字节以强制执行正确的字节边界 因此编译器会根据其类型添加额外的字节以强制每个成员的正确位置 有一个选项可以阻止编译器执行此操作(打包指令),但最好避免它(除了在角落情况下)

答案 3 :(得分:0)

如果您遇到问题,可以使用#pragma或编译器开关(各种编译器都有这样的开关)。