关于sizeof(struct)的讨论

咋了啦 2008-10-09 04:47:27
代码:

#include <iostream>
#include <iomanip>

struct A
{
char ch;
int nCount;
double dWidth;
};

struct A1
{
char ch;
double dWidth;
int nCount;
};

union B
{
char ch;
double dWidth;
int nCount;
};

int main()
{
using std::cout;
using std::endl;

A1 a1;
a1.ch = 'B';
a1.dWidth = 1.0;
a1.nCount = 2;
cout<<"sizeof(A1) is : "<<sizeof(a1)<<endl;
cout<<"&a1.ch is : "
<<std::hex<<std::setfill('0')<<std::setw(8)<<std::setiosflags(std::ios::uppercase)
<<(int)&a1.ch<<endl
<<"&a1.dWidth is : "<<&a1.dWidth<<endl
<<"&a1.nCount is : "<<&a1.nCount<<endl
<<sizeof(&a1.nCount)
<<endl;

A1 a2;
a2.ch = 'B';
a2.dWidth = 1.0;
a2.nCount = 2;
cout<<"sizeof(A1) is : "<<sizeof(a2)<<endl;
cout<<"&a2.ch is : "
<<std::hex<<std::setfill('0')<<std::setw(8)<<std::setiosflags(std::ios::uppercase)
<<(int)&a2.ch<<endl
<<"&a2.dWidth is : "<<&a2.dWidth<<endl
<<"&a2.nCount is : "<<&a2.nCount<<endl
<<sizeof(&a2.nCount)
<<endl;

cout<<"sizeof(B) is : "<<sizeof(B)<<endl<<endl;

A a;
a.ch = 'A';
a.nCount = 1;
a.dWidth = 2;
cout<<"sizeof(A) is : "<<sizeof(A)<<endl;
cout<<"&a.ch is : "
<<std::hex<<std::setfill('0')<<std::setw(8)<<std::setiosflags(std::ios::uppercase)
<<(int)&a.ch<<endl
<<"&a.nCount is : "<<&a.nCount<<endl
<<"&a.dWidth is : "<<&a.dWidth<<endl
<<endl;


return 0;
}



结果和内存图片传不上来啊,所以只有贴出来
sizeof(A1) is : 24
&a1.ch is : 0012FF4C
&a1.dWidth is : 0012FF54
&a1.nCount is : 0012FF5C
4
sizeof(A1) is : 18
&a2.ch is : 0012FF2C
&a2.dWidth is : 0012FF34
&a2.nCount is : 0012FF3C
4
sizeof(B) is : 8

sizeof(A) is : 10
&a.ch is : 0012FF14
&a.nCount is : 0012FF18
&a.dWidth is : 0012FF1C

Press any key to continue . . .

0x0012FF14 cccccc41 A...
0x0012FF18 00000001 ....
0x0012FF1C 00000000 ....
0x0012FF20 40000000 ...@

0x0012FF2C cccccccccccccc42 B.......
0x0012FF34 3ff0000000000000 .......?
0x0012FF3C cccccccc00000002 ........

0x0012FF4C cccccccccccccc42 B.......
0x0012FF54 3ff0000000000000 .......?
0x0012FF5C cccccccc00000002 ........

大家看看,自己在自己的机子上试试。为什么那样的结果。

我是VS 2005 sp2, XP sp3
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
引力场变动源 2008-10-10
  • 打赏
  • 举报
回复
很简单啊,第二个sizeof(A1)输出的是16进制的值,所以18其实是0x18=24.
sizeof(A)=10也是一样的,那个10也是16进制的,所以实际上是0x10=16

因为你在用10进制输出了第一个sizeof(A1)之后使用了std::hex模式,使用这个模式以后,后面所有的输出都是默认16进制的。
咋了啦 2008-10-10
  • 打赏
  • 举报
回复
谢谢楼上啊,我大意了。

我根本就没想到我改变了输出的模式,所以钻牛角尖去找为什么变成18和10了

马上结贴给分。
咋了啦 2008-10-09
  • 打赏
  • 举报
回复
我知道是这样的,但现在关键是

1、连续两个sizeof(A1)为什么结果不一样?

2、sizeof(A)按内存对齐应该是16,为什么是10?
咋了啦 2008-10-09
  • 打赏
  • 举报
回复
whycom 2008-10-09
  • 打赏
  • 举报
回复
成员变量内存对齐
可以在编译选项里调整

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧