C++ 4字节对齐数据

Mir*_*pas 1 c++ memory

这个问题与如何确保成员是 4 字节对齐?

例子:

struct Aligned
{
    char c;
    __attribute__((__aligned__(4))) int32_t member;
}

struct Test
{
    char    c;
    Aligned s;//is s.member 4 bytes aligned?
}


void f1()
{
    char    c1;
    Aligned s;//is s.member 4 bytes aligned?
    char    c2;
}

void f2()
{
    Aligned* s = new Aligned();//is s.member 4 bytes aligned?
}
Run Code Online (Sandbox Code Playgroud)

您能否解释一下“member”是否在所有情况下都是 4 字节对齐的,如果是的话,这是如何工作的?

编辑:我忘记了 Aligned 是从其他结构派生的情况:

struct Aligned : public SomeVariableSizeStruct
{
    char c;
    __attribute__((__aligned__(4))) int32_t member;
}
Run Code Online (Sandbox Code Playgroud)

第二次编辑:我的问题是:结构的第一个成员总是 4 字节对齐吗?因为在此处介绍的所有情况下,第一个变量地址可能不是 4 字节对齐,并且 3 字节填充不能保证“成员”是 4 字节对齐

jal*_*alf 5

是的,它有效。需要编译器才能使其工作。

每种类型都有编译器必须遵守的对齐方式。您已指定一个特定对象应使用 4 字节对齐,但每个其他对象、 a char、 an int、 astd::string和其他任何对象有自己的对齐要求。

所以编译器已经习惯了处理这个问题。

为了确定 所需的对齐方式Aligned,编译器基本上会遍历其所有成员(及其基类)以找到需要最严格对齐的成员。然后,这也将成为 所需的对齐方式Aligned

在这种情况下,最对齐的成员是member,它需要 4 字节对齐。所以Aligned需要4字节对齐。

是的,无论您Aligned在堆栈上创建 an 作为函数局部变量,还是作为另一个类成员,或者在堆上使用new.