【问题标题】:Why object size increases if class uses virtual inheritance?如果类使用虚拟继承,为什么对象大小会增加?
【发布时间】:2018-11-12 09:33:50
【问题描述】:

在以下代码中:

#include <iostream>

class a {
    char a;
};

class b : virtual public a {
    char b;
};

class c : virtual public a {
    char c;
};

class d : public b, public c {
    char d;
};

int main() {
    std::cout << "sizeof a: " << sizeof(a) << std::endl;
    std::cout << "sizeof b: " << sizeof(b) << std::endl;
    std::cout << "sizeof c: " << sizeof(c) << std::endl;
    std::cout << "sizeof d: " << sizeof(d) << std::endl;
    return 0;
}

输出是:

sizeof a: 1
sizeof b: 16
sizeof c: 16
sizeof d: 32

我想知道为什么增加的大小是 16。 char 的大小为 1,这意味着增加的大小为 15。 我知道虚拟类需要一个指针来表示它的偏移量,它增加 4 个字节然后 11 个字节没有任何意义。 谁能解释为什么会这样, 我的问题不同,因为它是钻石继承案

【问题讨论】:

标签: c++ class inheritance virtual


【解决方案1】:

虚拟继承用于解决多继承中的Diamond问题。

虚拟继承会在子类的每个对象中创建一个vtable pointer

它使子类对象的大小增加,并且增加的大小取决于您的代码编译所在的操作系统。可能是您的代码已在 64 位操作系统中编译,因此 vtable pointer 的大小为 8 个字节。但你想知道为什么sizeof(b) = 16。答案是Memory alignment 机制。您可以参考下面的链接以了解更多关于我所说的内容以及对我糟糕的英语语法感到抱歉。

内存对齐和填充:

http://www.cplusplus.com/forum/articles/31027/

虚拟继承:

https://www.cprogramming.com/tutorial/virtual_inheritance.html

猜你喜欢
  • 2019-10-11
  • 2014-04-30
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2017-04-20
  • 1970-01-01
  • 2021-07-05
相关资源
最近更新 更多