C++ vtable查询

ira*_*ppa 2 c++

我对此处提供的解释有疑问http://www.parashift.com/c++-faq/virtual-functions.html#faq-20.4

在示例代码中的函数mycode(Base *p),调用virt3方法为p->virt3().在这里,编译器如何知道virt3是在第三个插槽中找到的vtable?它如何与之比较?

Mat*_*lia 5

当编译器看到Base它的定义时,vtable根据某个算法1决定它的布局,这对于所有派生类来说都是常见的,只要Base涉及从中继承的方法(派生类可以添加其他virtual方法,但它们被放入vtable 后面)继承自的东西Base).

因此,编译器看到的时候p->virt3(),就已经知道了,从继承的任何对象Base的指针正确virt3的,例如在的第三个插槽vtable(因为这是它奠定了vtableBase在其定义的时刻),因此它可以正确生成虚拟调用的代码.


长话短说(从@DavidRodríguez的评论中获取灵感):它知道它留在哪里因为他之前决定过.


1.标准没有强制要求任何特定算法(实际上,它没有说明应该如何实现C++ ABI),但是有几种广泛的C++ ABI规范,特别是Windows上的COM ABI和Linux上的Itanium ABI. (一般来说是gcc).显然,给定相同的类定义,算法必须每次都给出相同的vtable布局,否则将不可能将不同的对象模块链接在一起.

  • +1换句话说:编译器不需要*知道*,它*决定*槽. (3认同)