求解内存分布

badbirdboy 2014-03-18 12:21:50
class A
{
public:
A(){}
int x;
};
class B : public A
{
public:
B(){}
};

class D : public A
{
public:
D(){}
};


class C :virtual public D ,virtual public B
{
public:
C(){}
};

求解 sizeof(C),说说怎么理解!
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
badbirdboy 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
http://stackoverflow.com/questions/6552319/c-sizeof-of-a-class-with-functions 可以看看《深度探索C++对象模型》以及 C++标准规范。
看完《深度探索C++对象模型》后,我认为是sizeof(C) = 16,编译器给的答案是12,我还是没理解透!
JiMoKuangXiangQu 2014-03-18
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/6552319/c-sizeof-of-a-class-with-functions 可以看看《深度探索C++对象模型》以及 C++标准规范。
Adol1111 2014-03-18
  • 打赏
  • 举报
回复
引用 7 楼 badbirdboy 的回复:
嗯,有所领悟了,当有虚拟继承的时候会有一个指针,不论virtual public base class 的个数是多少,我以为每一个virtual public base class 都会指派一个指针!看来还是我理解有误!
虽然结贴了,但还是要说一下,你这里的一个问题!! 下面都是x86上打印的,上午是x64打印的,sizeof可能不对,你看看结构有什么不同
class A
{
public:
A(){}
int x;
};
class B : virtual  public A
{
public:
B(){}
};

class D : virtual public A
{
public:
D(){}
};

class C : public D ,public B
{
public:
C(){}
};

class C size(12):
        +---
        | +--- (base class D)
 0      | | {vbptr}
        | +---
        | +--- (base class B)
 4      | | {vbptr}
        | +---
        +---
        +--- (virtual base A)
 8      | x
        +---
C::$vbtable@D@:
 0      | 0
 1      | 8 (Cd(D+0)A)

C::$vbtable@B@:
 0      | 0
 1      | 4 (Cd(B+0)A)

class A
{
public:
A(){}
int x;
};
class B : public A
{
public:
B(){}
};

class D : public A
{
public:
D(){}
};


class C :virtual public D ,virtual public B
{
public:
C(){}
};

class C size(12):
        +---
 0      | {vbptr}
        +---
        +--- (virtual base D)
        | +--- (base class A)
 4      | | x
        | +---
        +---
        +--- (virtual base B)
        | +--- (base class A)
 8      | | x
        | +---
        +---

C::$vbtable@:
 0      | 0
 1      | 4 (Cd(C+0)D)
 2      | 8 (Cd(C+0)B)
harold2007 2014-03-18
  • 打赏
  • 举报
回复
说实话,我看不懂,但我在codeblocks下编译后值是12.
badbirdboy 2014-03-18
  • 打赏
  • 举报
回复
引用 4 楼 Adol1111 的回复:
[quote=引用 2 楼 badbirdboy 的回复:] [quote=引用 1 楼 JiMoKuangXiangQu 的回复:] http://stackoverflow.com/questions/6552319/c-sizeof-of-a-class-with-functions 可以看看《深度探索C++对象模型》以及 C++标准规范。
看完《深度探索C++对象模型》后,我认为是sizeof(C) = 16,编译器给的答案是12,我还是没理解透![/quote]

class C size(16):
        +---
 0      | {vbptr}
        +---
        +--- (virtual base D)
        | +--- (base class A)
 8      | | x
        | +---
        +---
        +--- (virtual base B)
        | +--- (base class A)
12      | | x
        | +---
        +---
[/quote] 嗯,有所领悟了,当有虚拟继承的时候会有一个指针,不论virtual public base class 的个数是多少,我以为每一个virtual public base class 都会指派一个指针!看来还是我理解有误!
JiMoKuangXiangQu 2014-03-18
  • 打赏
  • 举报
回复
引用 2 楼 badbirdboy 的回复:
[quote=引用 1 楼 JiMoKuangXiangQu 的回复:] http://stackoverflow.com/questions/6552319/c-sizeof-of-a-class-with-functions 可以看看《深度探索C++对象模型》以及 C++标准规范。
看完《深度探索C++对象模型》后,我认为是sizeof(C) = 16,编译器给的答案是12,我还是没理解透![/quote] 对象模型不是一成不变,关乎到编译器的实现,讨论非三言两语(至少我是说不清楚,呵呵)。 http://stackoverflow.com/questions/11603198/virtual-tables-and-memory-layout-in-multiple-virtual-inheritance http://www.phpcompiler.org/articles/virtualinheritance.html
Adol1111 2014-03-18
  • 打赏
  • 举报
回复
引用 2 楼 badbirdboy 的回复:
[quote=引用 1 楼 JiMoKuangXiangQu 的回复:] http://stackoverflow.com/questions/6552319/c-sizeof-of-a-class-with-functions 可以看看《深度探索C++对象模型》以及 C++标准规范。
看完《深度探索C++对象模型》后,我认为是sizeof(C) = 16,编译器给的答案是12,我还是没理解透![/quote]

class C size(16):
        +---
 0      | {vbptr}
        +---
        +--- (virtual base D)
        | +--- (base class A)
 8      | | x
        | +---
        +---
        +--- (virtual base B)
        | +--- (base class A)
12      | | x
        | +---
        +---
fgnicty 2014-03-18
  • 打赏
  • 举报
回复
运行的结果是16,包括int x和指向虚函数的指针。

64,282

社区成员

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

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