g ++ -fdump-class-hierarchy输出中的第一个(int(*)(…))0 vtable条目是什么?
|
对于此代码:
class B1{
public:
virtual void f1() {}
};
class D : public B1 {
public:
void f1() {}
};
int main () {
B1 *b1 = new B1();
D *d = new D();
return 0;
}
编译后,使用g++ -fdump-class-hierarchy
得到的vtable是:
Vtable for B1
B1::_ZTV2B1: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI2B1)
16 B1::f1
Vtable for D
D::_ZTV1D: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI1D)
16 D::f1
我不明白(int()(...))0 *等条目对应什么。当然,它的意思是这样的,它是一个返回int并接受无限数量参数的函数,我对此一无所知。
该功能指针对应于哪个功能?你怎么知道的?我的是64位机器。
第二个函数指针的末尾有一个关联的地址?与谁相对应?
编辑
我使用的编译器是g ++:
g++ -v
Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure --prefix=/usr --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.4 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion=\'SUSE Linux\' --disable-libgcj --disable-libmudflap --with-slibdir=/lib64 --with-system-zlib --cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --program-suffix=-4.4 --enable-linux-futex --without-system-libunwind --with-arch-32=i586 --with-tune=generic --build=x86_64-suse-linux
Thread model: posix
*gcc version 4.4.1 [gcc-4_4-branch revision 150839] (SUSE Linux)*
没有找到相关结果
已邀请:
2 个回复
纤洞需匪
,它是从基类
派生的。当您尝试将
实例强制转换为
时会发生什么?由于采用
对象的函数对
一无所知,因此
vtable的一部分也必须是有效的
vtable。这很容易-只需使
vtable的开始看起来像
vtable,然后添加我们需要的所有其他条目。期望
的函数将很高兴,因为它们不会使用vtable超出beyond5 beyond所期望的任何部分。 但是,如果现在ѭ4又也来自ѭ17,会发生什么呢?指向
vtable的指针不能同时是有效的
vtable和有效的
vtable!编译器通过在合并的
vtable的末尾附加一个单独的
vtable来解决此问题,并在我们尝试将
转换为
时手动调整vtable-pointer。 但是,这带来了一个新问题-当我们尝试从ѭ17退回到ѭ4时会发生什么?编译器不能只向后调整vtable-pointer使其达到与先前调整指针相同的数量,因为编译器实际上不确定我们要提供的
对象的类型为
!特别地,
必须能够判断我们的对象是否为
类型。为此,它需要访问对象的RTTI,为此,它需要知道原始对象的vtable的开始位置。这是top-to-top值的目的-它使我们向原始对象的vtable的起始位置偏移,获得对象的RTTI,而C ++的复仇之神使我们的作物得以生长再换一个季节 该页面有一些很好的vtable布局示例(在表1c下)。请注意,由于使用了虚拟继承,因此它们稍微复杂一些,这会为每个子类的vtable增加一个额外的偏移量。
凄挡