【发布时间】: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 个字节没有任何意义。 谁能解释为什么会这样, 我的问题不同,因为它是钻石继承案
【问题讨论】:
-
代码真的是为32位编译的吗?编译为 64 位,一个指针是 8 个字节,8 字节对齐,所以你需要 7 个字节的填充来填充结构,这将得到你观察到的 16 个字节。
-
是的,代码是 64 位的,好吧,这就解释了 16 位
标签: c++ class inheritance virtual