关于C++中sizeof()的问题

struct s4
{
 int i: 8;
 int j: 4;
 int a:3;
 double b;
};

cout<<sizeof(s4)<<endl;的输出是多少????
具体是怎么得出来?
谢谢喽!

结果是16.

不同的编译环境有不同的结果。我就拿VC6。0来讲。
首先,楼主可能有个疑问:
是不是sizeof(s4)等于sizeof(int)+sizeof(int)+sizeof(int)+sizeof(double)??
但是是不是这样的呢?其实不是的。
VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。

  类型
  对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)

  Char
  偏移量必须为sizeof(char)即1的倍数

  int
  偏移量必须为sizeof(int)即4的倍数

  float
  偏移量必须为sizeof(float)即4的倍数

  double
  偏移量必须为sizeof(double)即8的倍数

  Short
  偏移量必须为sizeof(short)即2的倍数

  各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-11-06
楼主你好!
我又来了.
struct s4
{
 int i: 8;
 int j: 4;
 int a:3;
 double b;
};
我来说下计算过程吧.首先位域i占8位,也就是一个字节.位域j占4位,位域a占3位,由于4+3<8,所以位域j跟位域a处于同一字节内,共占一个字节.到此为止.i,j,a共占2个字节.下面存入double b,由于sizeof(double)=8,也就是说double类型占8个字节,按照VC的变量对齐方式,b相对于起始地址的偏移量要是8的倍数.所以b从第8个字节开始存放.占8个字节.至于前面的字节,(第3个字节到第7个字节)VC自动填入毫无意义的数据.
所以结果等于16.
另外提醒一下楼主.sizeof()是计算字节,不是计算位.本回答被网友采纳
第2个回答  2019-09-07
sizeof(x)含义x所占字节数量
wsdouble数组包含三元素
类型double
[]每double占8字节8x3=24所sizeof(ws)返24
pw类型double*指向ws指针指针4字节所sizeof(pw)=4
第3个回答  2013-11-06
这种强制对齐不知道编译器怎么处理的,也很想知道结果,帮顶!
相似回答