我有结构
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
是整数变量,所以它需要 4 个字节,c
是 char 变量,所以它需要 1 个字节,总共 5 个字节
但是当我打印sizeof(obj)
它显示8 bytes。
是什么原因?
我有结构
typedef struct EData
{
int a;
char c;
}
Edata obj;
a
是整数变量,所以它需要 4 个字节,c
是 char 变量,所以它需要 1 个字节,总共 5 个字节
但是当我打印sizeof(obj)
它显示8 bytes。
是什么原因?
因为在 32 位系统上,内存在边界处对齐,4byte (32bit)
所以它必须是 4 字节的倍数,请参阅Data structure alignment
int
是4个字节,char
是1个字节。但是,您的编译器将每个字对齐struct
到一个字(在 32 位架构上一个字是 4 个字节),因为它提高了性能。因此,每个实例EData
将四舍五入为 2 个字(或 8 个字节)。
你最终得到的是这样的:
typedef struct EData {
int a;
char c;
char padding[3];
}
您注意到大小的增加是由于编译器的填充。
编译器添加额外的字节以强制执行正确的字节边界。
因此编译器添加额外的字节以根据其类型为每个成员强制执行正确的位置。
有一个选项可以阻止编译器执行此操作(打包指令),但最好避免它(极端情况除外)
如果这对您来说有问题,您可以使用#pragma
或编译器开关(各种编译器都有这样的开关)。