gpt4 book ai didi

c++ - 虚函数和多重继承情况下的对象布局

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

我最近在接受采访时被问及有关具有虚函数和多重继承的对象布局。
我在上下文中解释了它是如何在不涉及多重继承的情况下实现的(即编译器如何生成虚拟表,在每个对象中插入一个指向虚拟表的 secret 指针等等)。
在我看来,我的解释似乎缺少了一些东西。
所以这里有问题(见下面的例子)

  1. C 类对象的确切内存布局是什么。
  2. C 类的虚拟表条目。
  3. A、B 和 C 类对象的大小(由 sizeof 返回)。(8、8、16 ??)
  4. 如果使用虚继承呢?大小和虚拟表条目肯定会受到影响吗?

示例代码:

class A {  
public:
virtual int funA();
private:
int a;
};

class B {
public:
virtual int funB();
private:
int b;
};

class C : public A, public B {
private:
int c;
};

谢谢!

最佳答案

内存布局和虚表布局取决于您的编译器。以我的 gcc 为例,它们看起来像这样:

sizeof(int) == 4
sizeof(A) == 8
sizeof(B) == 8
sizeof(C) == 20

请注意,sizeof(int) 和 vtable 指针所需的空间也可能因编译器和平台而异。 sizeof(C) == 20 而不是 16 的原因是 gcc 为 A 子对象分配了 8 个字节,为 B 子对象分配了 8 个字节,为其成员 int c 分配了 4 个字节。

Vtable for CC::_ZTV1C: 6u entries0     (int (*)(...))04     (int (*)(...))(& _ZTI1C)8     A::funA12    (int (*)(...))-0x0000000000000000816    (int (*)(...))(& _ZTI1C)20    B::funBClass C   size=20 align=4   base size=20 base align=4C (0x40bd5e00) 0    vptr=((& C::_ZTV1C) + 8u)  A (0x40bd6080) 0      primary-for C (0x40bd5e00)  B (0x40bd60c0) 8      vptr=((& C::_ZTV1C) + 20u)

Using virtual inheritance

class C : public virtual A, public virtual B

布局变为

Vtable for CC::_ZTV1C: 12u entries0     16u4     8u8     (int (*)(...))012    (int (*)(...))(& _ZTI1C)16    0u20    (int (*)(...))-0x0000000000000000824    (int (*)(...))(& _ZTI1C)28    A::funA32    0u36    (int (*)(...))-0x0000000000000001040    (int (*)(...))(& _ZTI1C)44    B::funBVTT for CC::_ZTT1C: 3u entries0     ((& C::_ZTV1C) + 16u)4     ((& C::_ZTV1C) + 28u)8     ((& C::_ZTV1C) + 44u)Class C   size=24 align=4   base size=8 base align=4C (0x40bd5e00) 0    vptridx=0u vptr=((& C::_ZTV1C) + 16u)  A (0x40bd6080) 8 virtual      vptridx=4u vbaseoffset=-0x0000000000000000c vptr=((& C::_ZTV1C) + 28u)  B (0x40bd60c0) 16 virtual      vptridx=8u vbaseoffset=-0x00000000000000010 vptr=((& C::_ZTV1C) + 44u)

使用 gcc,您可以添加 -fdump-class-hierarchy 来获取此信息。

关于c++ - 虚函数和多重继承情况下的对象布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041673/

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