例如,考虑以下内容:
假设int是4个字节对齐的,而long是8个字节对齐的。
编译器在内存中布局的显而易见的方式是:AAAAPPPPBBBBBBBBCCCCPPPP,整个结构有8字节对齐。
P代表填充字节,A代表a的一个字节,B代表b的一个字节,C代表c的一个字节。
在这种情况下,example的sizeof为24。
但另一种方法是这样做的:
AAAABBBBBBBBCCCC,整个结构的对齐方式是起始字节地址模8 = 4(不确定如何更简洁地说)。
在这种情况下,不需要填充,因此每个实例可节省8个字节。
我的问题是,编译器是否允许这样做(按照标准)?他们真的这样做吗?我总是看到对齐只是以字节为单位讨论。
假设int是4个字节对齐的,而long是8个字节对齐的。
struct example
{
int a;
long b;
int c;
};
编译器在内存中布局的显而易见的方式是:AAAAPPPPBBBBBBBBCCCCPPPP,整个结构有8字节对齐。
P代表填充字节,A代表a的一个字节,B代表b的一个字节,C代表c的一个字节。
在这种情况下,example的sizeof为24。
但另一种方法是这样做的:
AAAABBBBBBBBCCCC,整个结构的对齐方式是起始字节地址模8 = 4(不确定如何更简洁地说)。
在这种情况下,不需要填充,因此每个实例可节省8个字节。
我的问题是,编译器是否允许这样做(按照标准)?他们真的这样做吗?我总是看到对齐只是以字节为单位讨论。
long
并列。联合体类型需要同时满足8+0和8+4的对齐要求。 - user743382