C++对象内存分配问题

zhengjiyue 2011-04-18 12:27:56
#include <iostream>
using namespace std;
class a
{
public:
char aa;
};
class b:public virtual a
{
public:
char bb;
};
class c:public virtual a
{
public:

};
class d:public b,public c
{
public:
};
int main()
{
a a1;
b b1;
c c1;
d d1;
cout<<sizeof(a1)<<" "<<sizeof(b1)<<endl;
cout<<sizeof(c1)<<endl;
cout<<sizeof(d1)<<endl;

}

为什么b1占9个字节,不是有字节对齐吗?
...全文
199 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengjiyue 2011-04-18
  • 打赏
  • 举报
回复
是不是因为他后面没有元素了 所以就不不齐了
我把class a改成
class a
{
public:
char aa;
int bb;
};
a所占字节就是8 原先是1
hzhxxx 2011-04-18
  • 打赏
  • 举报
回复


对齐的方式依赖于 编译器
we_sky2008 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhengjiyue 的回复:]
引用 5 楼 wulibin136 的回复:

不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内


那么怎么样才会进行对齐呢?
我对于对齐的理解就是把需要访问的元素放在4的倍数的地址上(4字节对齐)。
对于你说的情况,为什么会是8呢?……
[/Quote]
编译器的问题,换个编译器试试,
我用的DEV C++,结果是对齐了的
zhengjiyue 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wulibin136 的回复:]

不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内
[/Quote]

那么怎么样才会进行对齐呢?
我对于对齐的理解就是把需要访问的元素放在4的倍数的地址上(4字节对齐)。
对于你说的情况,为什么会是8呢?
luciferisnotsatan 2011-04-18
  • 打赏
  • 举报
回复
可能是虚继承的原因吧
淡蓝 2011-04-18
  • 打赏
  • 举报
回复
不是后面没有了就不对齐了的,下面这个类
class A
{
int a;
char b;
};
它的大小也是8,会对齐的
这个和虚继承有点关系,编译器不把指向虚基类的指针算在对齐范围内
we_sky2008 2011-04-18
  • 打赏
  • 举报
回复

DEV下面是有对齐的,
各个编译器实现虚拟继承的方式差别会很大,
下面是楼主所举例子在DEV下面的模型布局:

a:
____

aa //1 byte
____

a的大小为1 byte


b:
____

vbptr //4 byte
____

bb //1 byte
____

aa //1 byte
____

对齐之后大小为8 bytes



c:
____

vbptr //4 byte
____

aa //1 byte
____

对齐之后大小为8 bytes



d:
____

vbptr //4 byte
____

bb //1 byte
____

vbptr //4 byte
____

aa //1 byte
____

对齐之后大小为16 bytes
berkowitz 2011-04-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhengjiyue 的回复:]
是不是因为他后面没有元素了 所以就不不齐了
我把class a改成
class a
{
public:
char aa;
int bb;
};
a所占字节就是8 原先是1
[/Quote]

没错,如果后面还有元素,则会对齐,否则不会

b对象的内存使用情况是这样的
1、头4个字节存放虚函数表入口地址
2、接下来4个字节存放的是char bb的数据,注意,尽管bb只需要1个字节,但是后面还需要把继承来的char a的数据保存下来,所以bb进行了对齐,占用了4个字节,不相信你可以把char bb改成int bb试试,肯定大小是没有改变的
3、最后一个字节存放了a的数据

所以总大小为4+4+1=9

64,648

社区成员

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

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