"是什么意思?-6ren"> "是什么意思?-这是我的代码。我只是想看看virtual inherit的内存布局。 #include using namespace std; class A{ private: int a-6ren">
gpt4 book ai didi

c++ - ""是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:43 25 4
gpt4 key购买 nike

这是我的代码。我只是想看看virtual inherit的内存布局。

#include<iostream>
using namespace std;

class A{
private:
int a;
public:
virtual void print() const{
cout << a << endl;
}

};

class B:public virtual A{
private:
int b;
public:
void print() const{
cout << b << endl;
}
};



int main(){
A a;
B b;
return 0;
}

然后在gdb中,我用

p a
p b

输出是

(gdb) p a
$1 = {
_vptr.A = 0x400b40 <vtable for A+16>,
a = 0
}
(gdb) p b
$2 = {
<A> = {
_vptr.A = 0x400b18 <vtable for B+56>,
a = 4196384
},
members of B:
_vptr.B = 0x400af8 <vtable for B+24>,
b = 0
}
(gdb)

我知道 _vptr.A 和 _vptr.B 的含义,但我不明白 B+24 或 A+16 的 vtable 是什么意思。

感谢您的回答!

最佳答案

a 的 list 表明它是一个具有两个字段的类:一个指向 A 的 vtable 中偏移量为 16 的字节的 vptr 和一个数据元素 a含零。

第二个是沿着相同的路线但由于虚拟基类而更加复杂。它说 b 由 3 个字段组成:一个 A 的实例,其字段与上面的字段类似,然后是 B 的两个元素,同样如上所述。这次 vptr 指向偏移量 24。

为什么 vptr 指向表的中间而不是它的开头?你必须知道更多关于 gcc 内存布局的细节才能说,而我不知道。初始字节可能是 RTTI(运行时类型信息)并且给定的偏移量是虚函数指针数组的第一个元素。还有无数其他选择。

注意。有一些好资料in this earlier article说总是有 2 个指针引导 vtable:一个用于多重继承顶部指针,另一个用于 RTTI。如果你的机器和编译器是 64 位的(你真的应该提到这一点;这很重要),这与 16 字节的指针一致。 B 可能是 24 字节,因为有一个额外的指针来访问虚拟基类。

关于c++ - "<vtable for A+16>"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31129219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com