C++ 4 字节对齐数据

标签 c++ memory

这个问题与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 字节对齐,但所有其他对象、charintstd::string 和其他任何东西 都有自己的对齐要求。

所以编译器习惯于处理这个问题。

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

本例中最对齐的成员是member,它需要4字节对齐。所以 Aligned 需要 4 字节对齐。

是的,无论您是在堆栈上创建一个 Aligned 作为函数局部变量,还是作为另一个类成员,或者在堆上使用 new,这都是可以保证的。

关于C++ 4 字节对齐数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11983311/

相关文章:

c++ - 无缘无故的多重析构函数定义

linux - 如何切换gdb字节输出分组

c++ - 我可以使用placement new 来重置shared_ptr 中的对象吗?

c - 下面两个例子编译后会占用相同的内存吗?

android - 如何找出我的 Android 应用程序的内存占用?

c# - 我应该担心内存泄漏吗?

新婴儿贺卡的 C++ 代码片段

c++ - 尝试使用 CLion 使用 .C 和 .CPP 文件构建项目时出现未定义的引用错误

c++ - 正则表达式:用于选择响应的第 n 个参数的正则表达式

c++ - 我可以在 C++ 中将 setter 和 getter 结合在一个方法中吗?