内存对齐(具体使用C)

Max*_*Max 4 c memory struct

如果你在结构中有一个结构,请说:

struct {
    double a;
    struct {
        char *b[20];
        char c;
    }d;
}e;
Run Code Online (Sandbox Code Playgroud)

将需要从结构d的大小的多个开始,或d(char*b [20])的最大成员的大小的倍数?

Kei*_*son 5

结构e将从成员所需的任何对齐开始,并且作为整体的结构是可访问的.

对于不同的实现,该对齐将变化.

我们知道,对齐e至少为严格的alignmentf的double 至少为严格的对齐方式e.d-和对齐e.d将至少那样严格作为其成员的对齐方式.

与其他答案相反,标量类型的对齐不一定与其大小相同.例如,它double可能是8个字节,但只需要4个字节的对齐.将每个标量类型(整数,浮点,指针)与其完整大小对齐是相当普遍的,但它并不普遍.

并注意,最佳对齐可能比所需的对齐更严格.在x86上,据我所知,CPU可以访问任何字节边界上的对象 - 但访问正确对齐的对象更有效.(在其他CPU上,未对齐的访问可能需要软件支持.)编译器通常会对齐对象以获得最大效率(但可以提供非标准扩展以节省空间).

但是一种类型的对齐不能超过它的大小.例如,您不能使用需要4字节对齐的3字节类型.数组之间的元素之间不能有间隙.(在这种情况下,编译器可能会将类型填充为4个字节;填充将是对象的一部分,而不是插入对象之间.)