c - 结构大小问题,要求不需要的内存?

标签 c gcc structure sizeof bit-fields

#include <stdio.h>

int main()
{
    struct {
        int a : 1; // bit field sized 1
        double b;
    }structVar;
    //structVar.a = 10;
    printf("%d",sizeof(structVar));
}

在 linux 机器上的 gcc 编译器中,structVar 的大小是 16。 根据我的说法,对于 double 位域应该是 9. 8,对于 int 位域应该是 1。

知道为什么吗?

最佳答案

结构对齐(并填充)到其最大成员的大小 - 在这种情况下,对齐到 sizeof(double)。这是预期的(虽然不是标准要求的)并且是可预测的。第二个成员是 int、short 还是其他什么都没有关系,只要它小于 double,sizeof struct 就会是 16。

结构包装可以减小结构的大小。例如。 gcc 允许 #pragma pack(n) 为后续结构设置新的对齐方式,因此对齐方式 4 将为 12 字节。

原因是,如果你有这个结构的数组,第二个结构将是未对齐的。它可能会影响某些 CPU 的性能甚至出现故障。

关于c - 结构大小问题,要求不需要的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23953246/

相关文章:

c - 如何阻止我的代码使用 scanf 生成无限循环?

c - 如何扫描动态分配的struct int

c++ - 默认情况下,gcc 是否将程序链接到静态库或动态库?

c - GCC 编译错误 : "error: expected specifier-qualifier-list before..." from variadic macro

c - 在单个函数中初始化具有相同成员名称和成员计数的多个结构

c - 如何写入/proc 内核模块

mysql_get_server_info() 返回 NULL 但一切正常

c - 为什么ld无法从/etc/ld.so.conf中的路径找到库?

c - 使用函数指针结构的 C 包装函数

c - sigaction 未初始化 gcc 7