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