【问题标题】:memory alignment into structure - alignment size equal to largest member size内存对齐到结构 - 对齐大小等于最大成员大小
【发布时间】: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


【解决方案1】:

结构的整体对齐应该是具有最大对齐要求的元素的对齐。这是为了确保例如结构数组始终对齐的目的。如果没有,struct { int x; char c; }; 的大小将使第一个元素对齐,但接下来的三个元素将不对齐 x

通常可以说服编译器生成一个“打包”数据结构(没有对齐填充)并使用它来获取一个打包数组,但在除了非常特殊的情况下使用它是一个坏主意,因为充其量它更慢,最坏的情况是由于处理器中的“未对齐访问陷阱”而导致执行停止。

如果int 的大小是四个字节[它适用于我知道的所有编译器 - long 是 4 或 8 个字节,取决于编译器],无论是 32 位还是 64 位(至少 x86)将是 4 字节对齐的。

如果你想在一个结构中有一个 7 字节的“间隙”,这会起作用:

struct X { 
   char c;
   uint64_t x;
}; 

当然会有:

struct X { 
   char c;
   char padding[7]; 
   uint64_t x;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2016-09-18
    • 2012-06-23
    • 1970-01-01
    • 2017-06-20
    • 2011-05-07
    相关资源
    最近更新 更多