【发布时间】:2014-06-23 15:11:06
【问题描述】:
我有一个实现两个抽象类的类,如下所示。没有虚拟继承。没有数据成员。
class IFace1 {
public:
virtual void fcn(int abc) = 0;
};
class IFace2 {
public:
virtual void fcn1(int abc) = 0;
};
class RealClass: public IFace1, public IFace2 {
public:
void fcn(int a) {
}
void fcn1(int a) {
}
};
我发现 RealClass 的 vtable 和对象内存布局如下所示。
Vtable for RealClass
RealClass::_ZTV9RealClass: 7u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI9RealClass)
16 (int (*)(...))RealClass::fcn
24 (int (*)(...))RealClass::fcn1
32 (int (*)(...))-8
40 (int (*)(...))(& _ZTI9RealClass)
48 (int (*)(...))RealClass::_ZThn8_N9RealClass4fcn1Ei
Class RealClass
size=16 align=8
base size=16 base align=8
RealClass (0x2af836d010e0) 0
vptr=((& RealClass::_ZTV9RealClass) + 16u)
IFace1 (0x2af836cfa5a0) 0 nearly-empty
primary-for RealClass (0x2af836d010e0)
IFace2 (0x2af836cfa600) 8 nearly-empty
vptr=((& RealClass::_ZTV9RealClass) + 48u)
我对此感到困惑。什么是 RealClass::_ZThn8_N9RealClass4fcn1Ei?为什么 IFace2 的 vptr 指向那个?当我从 IFace2 * 调用 fcn1 时会发生什么?程序如何在RealClass的Vtable中找到RealClass::fcn1?我猜它不知何故需要使用 IFace2 vptr,但不清楚具体如何。
【问题讨论】:
-
有很多方法可以实现这一点。 refspecs.linuxbase.org/cxxabi-1.83.html 是一个好的、有据可查的文件(但它可能与您使用的不匹配)。
-
尝试查看为此类调用生成的代码?
-
RealClass::_ZThn8_N9RealClass4fcn1Ei 是一个
RealClass::non-virtual thunk to RealClass::fcn1(int),它可能用于内联和其他调用优化。提示:c++filt程序是你的朋友。 -
我认为 RealClass::_ZThn8_N9RealClass4fcn1Ei 是 gcc 用于直接调用 RealClass::fcn1 的魔法函数。当我们使用 IFace2* 调用 fcn1 时,它只是调用其 vptr 所指向的函数
标签: c++