1

我有结构

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

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

但是当我打印sizeof(obj)它显示8 bytes

是什么原因?

4

4 回答 4

4

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

于 2010-12-31T10:13:21.373 回答
3

int是4个字节,char是1个字节。但是,您的编译器将每个字对齐struct到一个字(在 32 位架构上一个字是 4 个字节),因为它提高了性能。因此,每个实例EData将四舍五入为 2 个字(或 8 个字节)。

你最终得到的是这样的:

typedef struct EData {
    int a;
    char c;
    char padding[3];
}
于 2010-12-31T10:13:09.373 回答
1

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

于 2010-12-31T10:21:12.170 回答
0

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

于 2010-12-31T10:20:08.120 回答