问个虚继承时sizeof类大小的问题

bulver 2012-06-20 10:41:13
#include <iostream>

using namespace std;

class demo
{
int c;
public:
virtual void f(){}
};

class Derived : public virtual demo
{
virtual void g(){}
};

int main()
{
cout<<sizeof(demo)<<endl;
cout<<sizeof(Derived)<<endl;

return 0;
}

上面的代码结果是8,12,但是把demo中的int c去掉之后,结果就变成了4,4。
不明白为什么啊,上网查也没看明白,有人帮忙讲解下么?gcc的编译器。
...全文
175 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-06-20
  • 打赏
  • 举报
回复
不同的编译器,处理方式有所不同,所以不同的编译器你可能会得到不同的结果。

这种问题,一点不研究不太好,过渡研究也不太好。看完《Inside C++ Object Model》就可以了。
paschen 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

空基类优化!
[/Quote]

貌似说中了要点了,去网上找了个解释的:http://blog.csdn.net/tengomi/article/details/1699705
W170532934 2012-06-20
  • 打赏
  • 举报
回复
8和12的。基类一个int 4字节,一个虚函数,导致了一个虚函数表的指针4字节。所以基类是8字节,然后继承类里面又多了一个自身的虚函数的表指针4字节。所以继承类是12字节。
去掉int后都是4字节。我猜测是因为没有数据了,导致编译器认为上面那个是纯虚函数了吧。两个虚函数都合成到一个虚函数表里面了。只是个人猜测。坐等大牛。没有研究过gcc关于C++的内存模型。
楼主可以搜索下gcc关于C++的内存模型。
paschen 2012-06-20
  • 打赏
  • 举报
回复
帮你在VS2010下调试了下,不是你说的那样,不知是不是编译器不同而不同。

测试结果:
开始:8,16
去掉后:4,12

这个结果很刚好是减掉一个int的大小
pengzhixi 2012-06-20
  • 打赏
  • 举报
回复
空基类优化!
qq120848369 2012-06-20
  • 打赏
  • 举报
回复
可以不探究这个, 因为我也不太懂, 你看你用到了虚函数, 虚继承, 比较复杂.

如果要探究只能看<<深入探索C++对象模型>>了。
bulver 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

去看看空基类优化的一些说法 你就应该有些眉目了。
[/Quote]
OK,谢了哈~
pengzhixi 2012-06-20
  • 打赏
  • 举报
回复
去看看空基类优化的一些说法 你就应该有些眉目了。
bulver 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

可以不探究这个, 因为我也不太懂, 你看你用到了虚函数, 虚继承, 比较复杂.

如果要探究只能看<<深入探索C++对象模型>>了。
[/Quote]
看来还是先看下书好了
bulver 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

帮你在VS2010下调试了下,不是你说的那样,不知是不是编译器不同而不同。

测试结果:
开始:8,16
去掉后:4,12

这个结果很刚好是减掉一个int的大小
[/Quote]
我用VS2010跟你结果也是一样的,应该是编译器有关的

64,648

社区成员

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

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