关于C++类对象所占空间大小问题3

jin_shan 2007-02-18 10:02:20
#include <iostream>
#include <memory>
using namespace std;
class CA
{
public:
double k;
public:
void f()
{
cout<<"CA::F"<<endl;
}
};
class CB:virtual public CA
{
};
class CC:virtual public CA
{
};
class CD:public CB,public CC
{
};
int main()
{
CD d;
d.f();
cout<<sizeof(d)<<endl;
return 0;
}
问题:
为什么在基类中将变量k声明为int时,程序运行显示12(4*3),而将变量k声明为double时,程序运行显示16(?*?)?
...全文
424 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
eagle_225 2007-02-23
  • 打赏
  • 举报
回复
To:snickersun(阳)
如果你把编译器里面的对齐方式设置为4字节对齐,则就是出现的16
顺便更正上面的答案
多一重虚拟继承,增加一个虚拟指针。
eagle_225 2007-02-23
  • 打赏
  • 举报
回复
首先,成员变量 K 为int时,4个 字节,还有一个函数指针,4字节。。
类D虚拟继承A ,所以应该添加一个ptr指向 虚拟函数表,这个指针也是4字节,所以为12.
当变量为K 时,总大小为 8+ 4 + 4 = 16;
snickersun 2007-02-21
  • 打赏
  • 举报
回复
为什么Double时,在我的机器上显示24?
amdyang 2007-02-20
  • 打赏
  • 举报
回复
虚类是因为里面有个 指针占3个字节
amdyang 2007-02-20
  • 打赏
  • 举报
回复
你可以参考下 对齐问题
用GOOGLE 搜索下
amdyang 2007-02-20
  • 打赏
  • 举报
回复
涉及到对其问题
1和编译器有关 可以设置对其量的 比如8
如果变量长度为4则当作8算
10当作2*8=16算的
2如果有虚类记为3
htqx 2007-02-19
  • 打赏
  • 举报
回复
赞成
jin_shan 2007-02-19
  • 打赏
  • 举报
回复
sizeof(int) = 4, sizeof(double) = 8, 他们两者的差是4 个字节。 你的结果他们也差4 字节 。


这能说明原理吗?我想知道的是原理。。。

而且,我现在探讨的是siezeof(class object)在不同类型成员时其值没有对应关系。
比如将变量k声明为double时,我以为程序运行回显示24(8*3),但是实际却显示16,为什么?因为虚拟继承的时候基类已经生成一个拷贝,避免了二义性问题。。
acange 2007-02-19
  • 打赏
  • 举报
回复
object的size 不光是里面的数据成员的大小, compiler再object 里面插入一些别的东西, 比如涉及到虚拟和多态,则object的第一个4bytes会指向虚函数表。

你可以看到, sizeof(int) = 4, sizeof(double) = 8, 他们两者的差是4 个字节。 你的结果他们也差4 字节 。
htqx 2007-02-19
  • 打赏
  • 举报
回复

这个和编译器插入隐藏的成员有关,至于插入多少和插在哪里,这是编译器作者的权利。
int 是12,我们可以知道Int为4,那么插入的是8,而double是8,那么加上插入的8,结果就是16.

64,654

社区成员

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

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