这个问题与如何确保成员是 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 字节对齐
是的,它有效。需要编译器才能使其工作。
每种类型都有编译器必须遵守的对齐方式。您已指定一个特定对象应使用 4 字节对齐,但每个其他对象、 a char
、 an int
、 astd::string
和其他任何对象也有自己的对齐要求。
所以编译器已经习惯了处理这个问题。
为了确定 所需的对齐方式Aligned
,编译器基本上会遍历其所有成员(及其基类)以找到需要最严格对齐的成员。然后,这也将成为 所需的对齐方式Aligned
。
在这种情况下,最对齐的成员是member
,它需要 4 字节对齐。所以Aligned
需要4字节对齐。
是的,无论您Aligned
在堆栈上创建 an 作为函数局部变量,还是作为另一个类成员,或者在堆上使用new
.
归档时间: |
|
查看次数: |
4435 次 |
最近记录: |