如果你在结构中有一个结构,请说:
struct {
double a;
struct {
char *b[20];
char c;
}d;
}e;
Run Code Online (Sandbox Code Playgroud)
将需要从结构d的大小的多个开始,或d(char*b [20])的最大成员的大小的倍数?
结构e
将从成员所需的任何对齐开始,并且作为整体的结构是可访问的.
对于不同的实现,该对齐将变化.
我们知道,对齐e
将至少为严格的alignmentf的double
和至少为严格的对齐方式e.d
-和对齐e.d
将至少那样严格作为其成员的对齐方式.
与其他答案相反,标量类型的对齐不一定与其大小相同.例如,它double
可能是8个字节,但只需要4个字节的对齐.将每个标量类型(整数,浮点,指针)与其完整大小对齐是相当普遍的,但它并不普遍.
并注意,最佳对齐可能比所需的对齐更严格.在x86上,据我所知,CPU可以访问任何字节边界上的对象 - 但访问正确对齐的对象更有效.(在其他CPU上,未对齐的访问可能需要软件支持.)编译器通常会对齐对象以获得最大效率(但可以提供非标准扩展以节省空间).
但是一种类型的对齐不能超过它的大小.例如,您不能使用需要4字节对齐的3字节类型.数组之间的元素之间不能有间隙.(在这种情况下,编译器可能会将类型填充为4个字节;填充将是对象的一部分,而不是插入对象之间.)