C ++虚拟内存布局

时间:2015-06-17 12:41:12

标签: c++ inheritance memory-management virtual-inheritance

了解虚拟继承内存布局

我正在努力更好地理解vTables和vPointers为我们提供的解析内存布局。我完全理解多态性及其工作原理,并且确实没有问题,但是有一些小问题我似乎正在趁着内存布局并理解虚拟基本偏移。我知道这些东西在每天的C ++代码中并不是完全必要的,但是为了得到正在发生的事情,这是我的兴趣。

我一直在引用this网站,以帮助理解因使用虚拟继承而导致的内存布局。

在页面的虚拟继承部分中,大约有一半的时间它为所生成的vTable提供了视觉效果,但是我想澄清一下我认为发生了几个事件的顺序:

http://www.phpcompiler.org/articles/virtualinheritance/vtable2.png

在上图中,我觉得:

  • 我们首先包含指向Left vTable
  • 的vPtr
  • 接下来首先包含Left类的唯一值(Left::b
  • 接下来,计算偏移量,以便我们可以在刚刚包含的数据之后直接放置任何虚拟继承的数据。 vPtr的大小+ int Left::b = 8,因此我们将Top::a偏移8,并将其添加到布局的底部。
  • 冲洗并重复正确的课程

http://www.phpcompiler.org/articles/virtualinheritance/vtable3.png

在上面的这张图片中,我觉得:

  • 我们首先包括我们继承的第一类vPtr
  • 由于我们不是虚拟继承该直接基类,我们可以直接继承特定于该类的任何非虚拟数据成员,而无需抵消即(Left::b
  • 我们包括继承自
  • 的第二类的vPtr
  • 由于我们不是虚拟继承该直接基类,我们可以直接继承特定于该类的任何非虚拟数据成员,而无需抵消即(Right::c
  • 接下来包含Bottom班级Bottom::d
  • 的所有唯一数据
  • 接下来,我们计算超类中虚拟数据的偏移量,并将其包含在内存布局的底部。
  • 最后我们完成了Bottom
  • 的内存布局

对我而言,我认为在许多情况下确定内存布局时上述过程是有意义的,但是我想知道如果我改变一些事情会发生什么。

  1. 如果Bottom几乎从LeftRight
  2. 继承,内存布局会如何变化?
  3. 底部定期继承LeftRight,但说Right定义了自己的int a,显然这会使bottom.a等于bottom.Right::a 1}}因为它是最近被覆盖的,但是它会放在内存布局中吗?
  4. 我的每个问题都有一个提案布局(2),并想知道我背后的想法是否正确,如果没有,为什么......谢谢!

    1)

    +--Bottom---+
    | vPtrLeft  |
    | vPtrRight |
    | Bottom::d |
    |  Left::b--+---From offset calculated by vPtr.Left in Bottom vTable
    |  Right::b-+---From offset calculated by vPtr.Right in Bottom vTable
    |  Top::a --+---From offsets calculated from vPtr.Left and vPtr.Right
    +-----------+
    
    • 包含vPtr.Left,然后查找左边没有虚拟继承的任何唯一数据(None)(即不要求偏移)
    • 包含vPtr.Right,然后查找任何唯一的数据,而不是虚拟继承(None)(即不需要抵消)
    • 添加特定于此课程的所有数据,(Bottom::d
    • 获取需要偏离Left的所有虚拟数据,然后Right爬上继承链,直到我们完成LeftRight的虚拟继承{{1}属性

    2)。

    Top::a

    寻找我对这些布局背后逻辑的反馈,谢谢。

    编辑:

    我知道这被标记为重复,但我相信这个问题涉及的内容比其他问题更多,我正在寻找一些常规多虚拟继承变体的答案,以了解具有虚拟继承的对象内存布局< / p>

0 个答案:

没有答案