为了账号安全,请及时绑定邮箱和手机立即绑定

为什么structof sizeof不等于每个成员的sizeof总和?

为什么structof sizeof不等于每个成员的sizeof总和?

FFIVE 2019-05-22 13:03:00
为什么structof sizeof不等于每个成员的sizeof总和?为什么sizeof操作员返回的结构尺寸大于结构成员的总尺寸?
查看完整描述

4 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

这是因为添加了填充以满足对齐约束。数据结构对齐会影响程序的性能和正确性:

  • 错误对齐访问可能是一个很难的错误(通常SIGBUS)。

  • 错误对齐的访问可能是软错误。

    • 在硬件中进行了更正,以适度降低性能。

    • 或者通过软件仿真进行校正,以降低性能。

    • 此外,原子性和其他并发保证可能会被破坏,从而导致细微的错误。

以下是使用x86处理器的典型设置(所有使用的32位和64位模式)的示例:

struct X{
    short s; /* 2 bytes */
             /* 2 padding bytes */
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 3 padding bytes */};struct Y{
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */
    short s; /* 2 bytes */};struct Z{
    int   i; /* 4 bytes */
    short s; /* 2 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */};const int sizeX = sizeof(struct X); /* = 12 */const int sizeY = sizeof(struct Y);
              /* = 8 */const int sizeZ = sizeof(struct Z); /* = 8 */

可以通过对齐对成员进行排序来最小化结构的大小(按照基本类型中的大小排序)(Z如上例中的结构)。

重要说明:C和C ++标准都声明结构对齐是实现定义的。因此,每个编译器可能选择以不同方式对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。某些编译器具有命令行设置和/或特殊#pragma语句来更改结构对齐设置。


查看完整回答
反对 回复 2019-05-22
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这可能是由于字节对齐和填充,因此结构在平台上产生偶数个字节(或字)。例如,在Linux上的C中,有以下3种结构:


#include "stdio.h"



struct oneInt {

  int x;

};


struct twoInts {

  int x;

  int y;

};


struct someBits {

  int x:2;

  int y:6;

};



int main (int argc, char** argv) {

  printf("oneInt=%zu\n",sizeof(struct oneInt));

  printf("twoInts=%zu\n",sizeof(struct twoInts));

  printf("someBits=%zu\n",sizeof(struct someBits));

  return 0;

}

具有大小(以字节为单位)的成员分别是4字节(32位),8字节(2x32位)和1字节(2 + 6位)。上面的程序(在Linux上使用gcc)将大小打印为4,8和4 - 其中最后一个结构被填充,因此它是一个单词(在我的32位平台上为4 x 8位字节)。


oneInt=4

twoInts=8

someBits=4


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 932 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信