读过《深度探索C++对象模型》的请进来帮忙

Michael_Xie 2010-02-26 05:18:32
#include <iostream>

using namespace std;

class X {char mem;};

class Y : public virtual X {};
class Z : public virtual X {};

class A : public Y, public Z {};

int main(void)
{
cout << "sizeof(X) = " << sizeof(X) << endl;
cout << "sizeof(Y) = " << sizeof(Y) << endl;
cout << "sizeof(Z) = " << sizeof(Z) << endl;
cout << "sizeof(A) = " << sizeof(A) << endl;
return 0;
}

如果你看The Semantics of Data一节,你想上边输出的结果是什么?
我以为是:
sizeof(X) = 1
sizeof(Y) = 4
sizeof(Z) = 4
sizeof(A) = 8

可结果是:
sizeof(X) = 1
sizeof(Y) = 5
sizeof(Z) = 5
sizeof(A) = 9

请问为什么?谁能给个详细解答,谢谢!
...全文
112 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 2 楼 yshuise 的回复:
虚拟指针是4,加上class X的1刚好是5


严重同意,很久以前我也研究过这个问题,结果就是位哥们说的
耍宝王 2010-02-26
  • 打赏
  • 举报
回复
请问LZ你是用什么编译器啊?
我用MinGW(GCC4.4.3)编译的结果是
sizeof(X) = 1
sizeof(Y) = 8
sizeof(Z) = 8
sizeof(A) = 12

指定对齐系数后
#include <iostream>

using namespace std;

class X {char mem;};

#pragma pack(1)
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
#pragma pack()

int main(void)
{
cout << "sizeof(X) = " << sizeof(X) << endl;
cout << "sizeof(Y) = " << sizeof(Y) << endl;
cout << "sizeof(Z) = " << sizeof(Z) << endl;
cout << "sizeof(A) = " << sizeof(A) << endl;
return 0;
}

输出结果为:
sizeof(X) = 1
sizeof(Y) = 5
sizeof(Z) = 5
sizeof(A) = 9

从这里看,楼主的编译器对此默认或优化后的对齐系数为:1
lrqsf 2010-02-26
  • 打赏
  • 举报
回复
vptr...
输出地址看看,类对象地址和成员变量地址相差是不是相差4。。
Michael_Xie 2010-02-26
  • 打赏
  • 举报
回复
如果有位对齐的话,应该是1 8 8 12才对啊
Michael_Xie 2010-02-26
  • 打赏
  • 举报
回复
如果class X里没有成员的话,结果是1 4 4 8,那是因为增加了一个bit来标识class X object的位置,而现在有一个成员了,sizeof(X) = 1,为什么sizeof(Y) = 5, sizeof(Z) = 5, sizeof(A) = 9?
yshuise 2010-02-26
  • 打赏
  • 举报
回复
虚拟指针是4,加上class X的1刚好是5
pengzhixi 2010-02-26
  • 打赏
  • 举报
回复
上面不是画图都画得很清楚吗?

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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