为什么内存对齐会在结构内发生变化?
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
:
开始
1B8
:unsigned long
被填充,因为结构是8字节对齐的
1C0
:double
占用8个字节
1C8
:fourth_struct
紧随其后,4字节对齐
到现在为止,一切都如期而至。但是现在 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。
在
明白了。
至少我以为我明白了。
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
:
1B8
:unsigned long
被填充,因为结构是8字节对齐的1C0
:double
占用8个字节1C8
:fourth_struct
紧随其后,4字节对齐
到现在为止,一切都如期而至。但是现在 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。