c++ - 未命名结构的编译器重新排序

标签 c++ c

struct unaming
{
    char f;
    double dd;

    struct 
    {
    int data;
    char c;
    double d;
    };
};

我原以为这个结构的大小是 40 字节。但是编译器返回了 32 个字节。 我期待以下布局。

[char f][7 bytes][double dd] [int data][4 bytes][char c][7bytes][double d] = 40

这是基于结构及其成员变量将与存在的最大数据类型对齐的规则。

但看起来编译器重新排序了未命名的结构。是这样吗?为什么是 32 字节?

最佳答案

规则并不是每个结构体成员都必须按照结构体中成员的最大对齐要求来对齐。规则是每个成员都必须根据自己的对齐要求进行对齐。

对于您的结构,假设 charintdouble 的大小分别为 1、4 和 8 个字节,并且假设它们的对齐要求也是 1、4 和 8 个字节,典型 C 实现中的布局是:

  • char f 位于偏移量 0。
  • 7 个字节的填充使偏移量达到 8,这是 double 所需要的。
  • double dd 位于偏移量 8。
  • struct 从偏移量 16 开始。
  • int data 位于偏移量 16。
  • char c 位于偏移量 20 处。
  • 三个字节的填充使偏移量达到 24,这是 double 所需要的。
  • double d 位于偏移量 24。

这使得总大小为 32 字节。因为它是八的倍数,所以最后不需要填充。 (由于结构可以用在数组中,因此结构的总大小需要是其对齐要求的倍数,以便数组中的连续结构落在所需的对齐边界上。)

关于c++ - 未命名结构的编译器重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51869099/

相关文章:

c - 读取C语言文本文件

用 C 编写的程序可以获取/打印编译时间吗?

c - 有效地收集单个字节,以 4 的字节步长分隔

c - 我用 C 编写的这个字符串反转器有什么问题?

c++ - 静态类成员显示令人困惑的语法错误

c++ - cout 函数调试断言失败

c - 我的信号处理程序中的竞争条件? (C)

c++ - 我在哪里可以找到 NS2 库的 cpp 文件中生成的打印信息,其中我添加了一些 cout() 函数来打印一些信息?

c++ - 如何在 for 循环中获得事件变量的数量?

c++ - 如何向 QListWidgetItem 插入子布局?