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