是否可以访问实现的vtbl?

时间:2015-06-09 04:29:38

标签: c++

我正在阅读Scott Myerses C ++,他说,当我们创建一个成员函数虚拟时,我们的类将包含一个指向所谓vtable的指针,除了它的成员。那么,有可能以某种方式访问​​这个poiter吗?我强调它是实现细节,但我们可以用g ++或clang来实现它。

1 个答案:

答案 0 :(得分:2)

另一个探索此问题的简单方法是http://gcc.godbolt.org - 它允许您输入程序并查看GCC生成的x86程序集(或者,尝试-S/S(VC ++)用你自己的编译器)。我把这个程序放在:

struct X
{
    virtual ~X() { }
    virtual void f() { }
};

int main()
{
  X x;
}

单击“指令”,以便显示vtable信息如下......

.LFE5:
    .size   main, .-main
    .weak   vtable for X
    .section    .rodata._ZTV1X,"aG",@progbits,vtable for X,comdat
    .align 32
    .type   vtable for X, @object
    .size   vtable for X, 40
vtable for X:
    .quad   0
    .quad   typeinfo for X
    .quad   X::~X()
    .quad   X::~X()
    .quad   X::f()
    .weak   typeinfo name for X
    .section    .rodata._ZTS1X,"aG",@progbits,typeinfo name for X,comdat
    .type   typeinfo name for X, @object
    .size   typeinfo name for X, 3
typeinfo name for X:
    .string "1X"
    .weak   typeinfo for X
    .section    .rodata._ZTI1X,"aG",@progbits,typeinfo for X,comdat
    .align 16
    .type   typeinfo for X, @object
    .size   typeinfo for X, 16
typeinfo for X:
    .quad   vtable for __cxxabiv1::__class_type_info+16
    .quad   typeinfo name for X
    .text