为什么内存对齐会在结构内发生变化?

Why does the memory alignment change within a structure?

, I 中,当一个具有 8 字节对齐的结构嵌入另一个具有 4 字节对齐的结构时,需要在 8 之前进行填充-字节对齐结构。

明白了。

至少我以为我明白了。

VS 2012 docs 说:

For structures, unions, and arrays, the alignment-requirement is the largest alignment-requirement of its members.

所以,如果我有这样的结构:

typedef struct s_inner {
  unsigned long ul1;
  double        dbl1;
  fourth_struct s4;
  unsigned long ul2;
  int           i1;
} t_inner;

我希望此结构的所有成员都是 8 字节对齐的,因为 double 是 8 字节对齐的。

但是我的内存转储显示了这个:

t_inner 从地址 1B8:

开始

到现在为止,一切都如期而至。但是现在 t_inner 内的对齐方式切换: 在地址 1E8 上,我希望在这里找到 unsigned long,用 4 个字节填充,以便后面的 int 也按 8 个字节对齐。但似乎对齐方式现在已经改变,因为 unsigned long 而不是 携带填充字节。相反,下面的 int 以 4 字节对齐方式放置。

为什么对齐开关在里面t_inner?这里应用了哪条规则?

I'd expect all members of this structure would be 8-byte aligned since the double is 8-byte > aligned.

嗯,不。每个类型在结构内部都有自己的对齐方式,并且结构本身有一个对齐方式最大 的内容排列。

aligned.    typedef struct s_inner {
      unsigned long ul1;        // 4-aligned
      double        dbl1;       // 8-aligned  (need 4 padding before this)
      fourth_struct s4;         // 4 aligned  size 32
      unsigned long ul2;        // 4 aligned  (no padding)
      int           i1;         // 4 aligned  (no padding)
      // no padding needed as struct is a multiple of 8 bytes
    } t_inner; 

由于双精度,结构本身对齐 8。