c - 位域未在字节边界对齐的结构的大小

标签 c struct memory-alignment

这是我的程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    struct bitfield {
         unsigned a:3;
         char b;
         unsigned c:5;
         int d;
    }bit;

    printf("%lu \n",sizeof(bit));
    return 0;
}

我原以为这个结构的大小相当大,但在我的机器上结果是 8,因为无符号是 4 个字节。现在我期望比这更多的原因是因为我希望 char b 位于字节边界上,以便它在内存中正确对齐。现在我的猜测是编译器将 a、b、c 全部放在这 4 个字节中。我是 C 的新手,所以请多多包涵。我假设除了位字段之外的所有其他数据类型都必须是字节不正确的吗?如果它是正确的,我希望 a 获取整个 unsigned int,而 b 获取一个字节,然后填充 3 个字节,然后依此类推。我在这里缺少什么?

最佳答案

我好像没看懂这个冲突。

你基本上有:

struct bitfield {
     unsigned a:3;
     unsigned padding1:5;
     char b;
     unsigned c:5;
     unsigned padding2:3;
     unsigned padding3:8;
     int d;
}bit;

a 在字节 1 边界上,它使用 3 位 + 5 位填充(因为没有更多的位字段来用完剩余的位)。

b 在字节 2 边界上,它使用一个完整的字节。

c 在字节 3 边界上,它使用 5 位 + 3 位填充(因为没有更多的位字段来用完剩余的位)。

- int padding comes here -

d 位于 int 边界(在您的机器上为 4 个字节)。它使用 1 个字节用于填充 + 4 个字节用于数据。

一共8个字节...

...虽然,正如@JonathanLeffler 在评论中指出的那样,这是特定于实现的,并不意味着每个编译器的行为都相同。

关于c - 位域未在字节边界对齐的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403919/

相关文章:

java - 带有 native 方法 malloc() 的 JNI 导致 Cygwin 崩溃

go - 我可以在共享结构中允许任意字段吗?

c# - 修改字典中的结构变量

使用 _aligned_malloc() 的 unique_ptr<> 的 C++ 数据对齐

c++ - 静态字符数组的对齐保证

c++ - 如何在 C 代码中包装 OpenCV C++ 函数

c - 解决迷宫问题的C程序

c - OpenGL(C语言): Make the shapes to be moved with keyboard (distortion issue)

dictionary - 如何在Golang中使用与 map 中的键相同的数据来区分两种自定义结构类型?

C# 与 C/C++ : do I need to order struct fields manually for best performance?