繁体   English   中英

虚拟功能机制的实现

[英]Virtual functions mechanism implementation

第一:我在某处读到虚函数的机制是不确定的。 也就是说,这意味着每个编译器都可以以不同的方式实现它。 但是,我发现的有关虚函数机制的每一篇文章都谈论VTBL和VPTR。

还有其他虚拟功能机制的实现吗? 你能举一些例子吗?

第二:使用不同语言的VTBL实施之间有什么区别?

我认为一种流行的替代方法是内联缓存 ,它源自Smalltalk系统。

另一种选择是每个多态方法都具有一个类型表,而不是每个类型都具有一个多态方法表(VMT)。 它需要整个程序的分析,但使高效的多重继承成为可能。 一些Eiffel编译器使用这种方法( 更多信息 ,请参见“如何有效地实现多重继承?”)。

最后一个还提到另一种方法,一种基于switch语句的方法(在Eiffel中进行检查〜在C中进行switch)。 SmartEiffel使用它的一种变体,它根据类ID进行二进制搜索。 它还需要整个程序的分析,但是由于更好的指令缓存行为,有时在当前系统上可能比VMT更有效率。 更多信息 ,请参见“没有虚拟功能表的高效动态调度”)。

这可能对您有帮助:

虚拟方法表:与替代方法的比较

不同的编译器供应商可能选择不同的方法...但是最终实现需要符合标准。 这是...

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf (第10.3节)

我给你看一个例子。

class B
{
private:
    int m_i;
public:
    void foo() { puts("B::foo"); }
    virtual void bar() { puts("B::bar"); }
};
class D : public B
{
private:
    int m_j;
public:
    virtual void bar() { puts("D::bar"); }
    virtual void asdf() { puts("D::asdf"); }
};

int main()
{
    D d;
    B *pb = &d;
    pb->bar();
}

大多数编译器按如下方式实现该代码:

struct B;
struct __vtbl_B_t
{
    void (*bar)(B * const this);
};
struct B
{
    const __vtbl_B_t *__vptr;
    int m_i;
};
void B__foo(B * const this) { puts("B::foo"); }
void B__bar(B * const this) { puts("B::bar"); }

const __vtbl_B_t __vtbl_B = { B__bar };
void B__ctor(B * const this)
{
    this->__vptr = &__vtbl_B;
}

struct D;
struct __vtbl_D_t
{
    __vtbl_B_t __base;
    void (*asdf)(D * const this);
};
struct D
{
    B __base;
    int m_j;
};
void D__bar(D * const this) { puts("D::bar"); }
void D__asdf(D * const this) { puts("D::asdf"); }

__vtbl_D_t __vtbl_D = { { (void (*)(B * const))D__bar }, D__asdf };
void D__ctor(D * const this)
{
    B__ctor((B * const)this);
    this->__base.__vptr = (const __vtbl_B_t *)&__vtbl_D;
}

int main()
{
    D d;
    D__ctor(&d);

    B *pb = (B *)&d;

    (*pb->__vptr->bar)(pb);
}

输出:

D::bar

即使您的语言不是C ++,编译器的行为也是相似的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM