gpt4 book ai didi

c++ - 如果类使用虚拟继承,为什么对象大小会增加?

转载 作者:行者123 更新时间:2023-11-30 03:23:05 28 4
gpt4 key购买 nike

在下面的代码中:

#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 个字节没有任何意义。谁能解释为什么会这样,我的问题是不同的,因为它是一个菱形继承(钻石问题)案例

最佳答案

虚继承用于解决多重继承中的菱形继承(钻石问题)。

虚继承会在子类的每个对象中创建一个虚表指针

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

内存对齐和填充:

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

虚拟继承:

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

关于c++ - 如果类使用虚拟继承,为什么对象大小会增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50657024/

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