这个问题与How to ensure a member is 4-byte aligned?有关
例子:
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?
}
您能否解释一下“member”是否在所有情况下都是 4 字节对齐的,如果是,这是如何工作的?
编辑: 我忘记了 Aligned 是从其他结构派生的情况:
struct Aligned : public SomeVariableSizeStruct
{
char c;
__attribute__((__aligned__(4))) int32_t member;
}
第二次编辑:我的问题是:结构的第一个成员总是 4 字节对齐吗?因为在此处呈现的所有情况下,第一个变量地址可能不是 4 字节对齐的,并且 3 字节填充不能保证“成员”是 4 字节对齐
最佳答案
是的,它有效。需要编译器才能使其工作。
每个 类型都有编译器必须遵守的对齐方式。您已指定一个特定对象应使用 4 字节对齐,但所有其他对象、char
、int
、std::string
和其他任何东西也 都有自己的对齐要求。
所以编译器习惯于处理这个问题。
为了确定 Aligned
所需的对齐方式,编译器基本上遍历其所有成员(以及其基类)以找到需要最严格对齐的那个。然后这成为Aligned
也需要对齐。
本例中最对齐的成员是member
,它需要4字节对齐。所以 Aligned
需要 4 字节对齐。
是的,无论您是在堆栈上创建一个 Aligned
作为函数局部变量,还是作为另一个类成员,或者在堆上使用 new
,这都是可以保证的。
关于C++ 4 字节对齐数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11983311/