c++ - 64位机器上的结构填充

标签 c++ c structure padding

struct A
{
    uint32_t var1;
    uint32_t var2;
    uint32_t var3;
    uint32_t var4;
    uint32_t var5;
};

在上面的结构中,编译器没有填充并分配了 20 个字节。

现在我们有另一种结构,它包含一个 8 字节变量而不是两个 4 字节。在这种情况下,编译器填充并为该结构分配 24 字节。

struct B
{
    uint32_t var1;
    uint32_t var2;
    uint32_t var3;
    uint64_t var5;
};

为什么会有这样的行为? 如果编译器将数据对齐到 8 字节边界,那么第一个结构中应该有 4 字节的填充并且应该 在这种情况下不要填充第二个结构。而且如果编译器将数据对齐到 4 字节边界,那么为什么在第二个结构中有 4 字节的填充?

编译器:GCC 平台:64 位 linux,x86_64

最佳答案

对齐规则(在 x86 和 x86_64 上)通常是根据变量的大小对齐变量。

换句话说,32 位变量按 4 个字节对齐,64 位变量按 8 个字节对齐,等等。

在你的第二种情况下,之间添加了 4 个字节的填充

uint32_t var3;
uint64_t var5;

var5 对齐 8 个字节。

因此,最好将数据成员从大到小排序(但由于数据局部性、可读性等原因,这并不是那么简单)。

关于c++ - 64位机器上的结构填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38788137/

相关文章:

c - OpenGL - 在没有旋转的情况下绕着太阳旋转月亮?

c++ - 设备说它可用,但无法在 OpenCL 中创建上下文

c++ - 使用 UpdateResource 更新字符串表

c - 可以访问继承结构的结构

不能输出工资和手机号。它总是在 C 中产生意想不到的结果

c++ - 与 LLVM JIT 代码共享 C++ 指针

c++ - C++ 中的常量和编译器优化

C++,使用 OpenCV 的像素的负 RGB 值

c++ - 通过运行应用程序以编程方式确定正在使用的共享库

ios - 查找来自特定类型的对象的父级