请解释一下:在VC和gcc下,虚继承大小不一样,

rainbow_jun 2007-09-15 12:52:25
#include<iostream.h>

class A
{private:
char a[3];
void virtual AA(){};
};

class B: private virtual A //virtual private p
{private:
char b[3];
void virtual BB(){};
};

class C:public virtual B //virtual public p
{private:
char c[3];
virtual void CC(){};

};


void main()
{

cout<<"sizeof(A)"<<sizeof(A)<<endl;
cout<<"sizeof(B)"<<sizeof(B)<<endl;
cout<<"sizeof(C)"<<sizeof(C)<<endl;

}

在VC下面:8 20 32 这个可以理解
在gcc下面:8 16 24 这个不能理解了????
...全文
196 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
nickshen_qidian 2007-09-17
  • 打赏
  • 举报
回复
在gcc中,类的基类指针在上面这种情况是和virtual函数指针vptr共用的,所以它编出的size较小,而vc中是分开的,所以vc编出来的size较大。B的size小一个指针(1个基类A),而C的size小2个指针(2个基类A,B)。
lovewhzlq 2007-09-15
  • 打赏
  • 举报
回复
楼上的,是数据对齐的原因,你看下我上面写的
你觉得是多少
zhhuajian 2007-09-15
  • 打赏
  • 举报
回复
第一个为什么是8啊?
lovewhzlq 2007-09-15
  • 打赏
  • 举报
回复
每个编译器数字对齐的方式是不一样的,所有当然输出也就不一样了


所谓数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍,DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽,x86 CPU能直接访问对齐的数据,当他试图访问一个未对齐的数据时,会在内部进行一系列的调整,这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序时会尽量保证数据对齐。
zhanggongzi 2007-09-15
  • 打赏
  • 举报
回复

老老实实的写代码,别搞这些花里胡哨的。

69,391

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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