为什么sizeof
运算符返回的结构大小大于结构成员的总大小?
最佳答案
这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性:
SIGBUS
)。 这是一个使用x86处理器的典型设置的示例(所有使用的32位和64位模式):
struct X
{
short s; /* 2 bytes */
/* 2 padding bytes */
int i; /* 4 bytes */
char c; /* 1 byte */
/* 3 padding bytes */
};
struct Y
{
int i; /* 4 bytes */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};
struct Z
{
int i; /* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};
const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */
通过按对齐方式对成员排序(按基本类型中的大小就足以进行排序)(例如上例中的结构
Z
),可以使结构的大小最小化。重要说明:C和C++标准均声明结构对齐方式是实现定义的。因此,每个编译器可能选择不同地对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。一些编译器具有命令行设置和/或特殊的
#pragma
语句来更改结构对齐设置。关于c++ - 为什么结构的sizeof不等于每个成员的sizeof之和?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43116983/