【问题标题】:why virtual table matters?为什么虚拟表很重要?
【发布时间】:2014-12-09 21:59:45
【问题描述】:

为了实现动态绑定,对于每个类,都有一个虚拟表来存储每个函数的addr。为什么需要这种间接性?我们可以让类直接将 ptr 存储到正确的函数吗?

【问题讨论】:

  • 不是每个班级。对于每一个对象。是的,我们可以,但这会非常浪费,并且会使生成的机器代码复杂化。
  • 如果每个对象都必须存储指向正确函数的指针,多态类的内存开销将是不真实的

标签: c++ function virtual vtable


【解决方案1】:

事实上你可以这样做。然后,每个多态类每个实例都需要将其整个虚拟表存储为对象的一部分。对于具有大量虚拟方法的类,这将是一个显着的内存开销。无法保证它会更快,因为您可以通过存储大量冗余数据来减少缓存局部性。

【讨论】:

  • 如果你想弄清楚它是如何工作的,想象一下编写一个编译器并从源代码中找出实际调用哪些函数以及何时调用。您不知道的位(例如,因为您只有一个指向基类的指针)是虚拟表的来源。
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 2010-09-22
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 2012-09-23
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多