【发布时间】:2014-10-08 07:16:34
【问题描述】:
我想知道为什么我们必须为结构的对齐大小取一个等于结构中最大成员大小的对齐大小。
例子:
struct MixedData
{
char Data1;
short Data2;
int Data3;
char Data4;
};
如果我们取最大的成员(int Data3),对齐是4个字节,所以我们要做:
struct MixedData /* After compilation in 32-bit x86 machine */
{
char Data1; /* 1 byte */
char Padding1[1]; /* 1 byte for the following 'short' to be aligned on a 2 byte boundary
assuming that the address where structure begins is an even number */
short Data2; /* 2 bytes */
int Data3; /* 4 bytes - largest structure member */
char Data4; /* 1 byte */
char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */
};
但是为什么我没有,在char Data1 之后,char Padding1[3] 所以short Data2 开始于adress(Data1) + 4 而不是char Data1[1]?
而且,按照同样的逻辑,为什么我在short Data2 之后没有short Padding3[1]?
另一个问题:如果我在 64 位处理器上,我应该使用 8 字节对齐,所以我必须设置以下内容:
struct MixedData /* After compilation in 64-bit x86_64 machine */
{
char Data1; /* 1 byte */
char Padding1[7]; /* 7 bytes */
int Data3;
int Padding2[1]/* 4 bytes */
char Data4;
char Padding3[7]; /* 7 bytes to make total size of the structure 24 bytes */
};
?
所以总大小 24 字节是 8 字节的倍数?
【问题讨论】:
-
填充通常用于“自然”对齐字段。也就是说,一个双字字段是双字对齐的,一个字字段是字对齐的,等等。例如,访问不是双字对齐(但字对齐)的字大小字段不会受到惩罚。
-
@500-InternalServerError: 这应该作为答案而不是评论发布。
标签: c++ c memory-alignment