【问题标题】:Why does 'sizeof' give wrong measurement? [duplicate]为什么“sizeof”给出错误的测量值? [复制]
【发布时间】:2011-09-08 16:49:32
【问题描述】:

可能重复:
struct sizeof result not expected

我有这个 C++ 结构:

struct bmp_header {

  //bitmap file header (14 bytes)
  char Sign1,Sign2; //2
  unsigned int File_Size; //4
  unsigned int Reserved_Dword; //4
  unsigned int Data_Offset; //4

  //bitmap info header (16 bytes)
  unsigned int Dib_Info_Size; //4
  unsigned int Image_Width; //4
  unsigned int Image_Height; //4

  unsigned short Planes; //2
  unsigned short Bits; //2  
};

它应该是 30 字节,但 'sizeof(bmp_header)' 给我的值是 32。怎么了?

【问题讨论】:

  • s/It is supposed to be 30 bytes/The sum total of each member is 30 bytes/
  • 还有下次请先搜索一下。
  • 尝试将第一个更改为char Sign[2];
  • 不过,归根结底,它并没有太大的区别,因为由于填充,如果你有一个 bmp_header 结构数组或类似的东西,填充将被包括在内无论如何,在数组的元素之间。

标签: c++ struct sizeof


【解决方案1】:

它不会给出错误的测量值。你需要了解alignment and padding

编译器可以在结构成员之间添加填充以遵守对齐约束。也就是说,可以使用编译器特定的指令来控制填充(参见GCC variable attributesMSVC++ pragmas)。

【讨论】:

    【解决方案2】:

    原因是因为填充。如果您将chars 放在结构的末尾,sizeof 可能会给您 30 个字节。整数通常存储在 4 的倍数的内存地址上。因此,由于字符占用 2 个字节,因此在它和第一个 unsigned int 之间有两个未使用的字节。 charint 不同,通常不填充。

    一般来说,如果空间是一个大问题,请始终将structs 的元素从最大到最小排序。

    请注意,填充并不总是(或通常)sizeof(element)巧合int 在 4 个字节上对齐,char 在 1 个字节上对齐。

    【讨论】:

      【解决方案3】:
      struct bmp_header {
      
        char Sign1,Sign2; //2
        // padding for 4 byte alignment of int: // 2
        unsigned int File_Size; //4
        unsigned int Reserved_Dword; //4
        unsigned int Data_Offset; //4
      
        unsigned int Dib_Info_Size; //4
        unsigned int Image_Width; //4
        unsigned int Image_Height; //4
      
        unsigned short Planes; //2
        unsigned short Bits; //2  
      };
      

      2+2+4+4+4+4+4+4+2+2 = 32。在我看来是正确的。如果您期望 30,则意味着您期望 1 字节填充,如:

      #pragma pack(push)
      #pragma pack(1)
      
      struct bmp_header {
      
        char Sign1,Sign2; //2
        unsigned int File_Size; //4
        unsigned int Reserved_Dword; //4
        unsigned int Data_Offset; //4
      
        unsigned int Dib_Info_Size; //4
        unsigned int Image_Width; //4
        unsigned int Image_Height; //4
      
        unsigned short Planes; //2
        unsigned short Bits; //2  
      };
      
      #pragma pack(pop)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-13
        • 1970-01-01
        • 2011-02-26
        • 2023-03-31
        • 2021-11-18
        • 1970-01-01
        • 2018-08-23
        相关资源
        最近更新 更多