虚拟类继承对象大小问题
Virtual class inheritance object size issue
在这里,在此代码中,ob1 的大小为 16,这很好(因为虚拟指针),但我不明白为什么 ob2 的大小是 24。
#include <iostream>
using namespace std;
class A {
int x;
};
class B {
int y, z;
};
class C : virtual public A {
int a;
};
class D : virtual public B {
int b;
};
int main() {
C ob1;
D ob2;
cout << sizeof(ob1) << sizeof(ob2) << "n";
}
我预计 ob2 的大小为 20,但输出为 24
类型D
的对象的一种可能的布局是:
+----------+
| y | The B subobject (8 bytes)
| z |
+----------+
| vptr | vtable pointer (8 bytes)
| |
+----------+
| b | 4 bytes
+----------+
| unused | 4 bytes (padding for alignment purposes)
+----------+
这将使sizeof(ob2)
24
。对齐要求由实现定义。大多数情况下,最大成员对象或子对象的大小决定了对象的对齐要求。在您的情况下,最大对象 vtable 指针的大小为 8 字节。因此,该实现在 8 位边界对齐对象,并在必要时添加填充。
为了实现虚拟继承,D
包含一个指针作为数据成员,在 64 位系统上需要 8 个字节。此外,这 8 个字节必须与 8 字节内存边界对齐。后一个要求反过来要求D
本身与 8 字节内存边界对齐。实现这一点的最简单方法是通过使用未使用的字节 (21-24) 填充sizeof(D)
来使其成为 8 的倍数。
相关文章:
- 在CToolBar对象中使用PNG时出现问题
- 将父类对象强制转换为子类的问题
- 类对象数组的问题会导致崩溃
- 在C++中遇到对象和类问题
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 在C ++ ASIO中,如何为HTTP或HTTPS创建相同的套接字对象(接口/抽象问题?
- 由于缺少类模板,NVCC 编译面向对象代码时出现问题
- C++删除/(递归)对象销毁问题
- C++ - 面试问题中的堆栈上的对象
- 将四元数旋转的游戏对象旋转另一个四元数时出现问题
- 通过 COM 对象连接 x64 应用程序时出现问题
- 擦除矢量问题矢量中的对象
- 将任意对象附加到数组有什么问题
- 在C++中将类实例添加到对象层次结构中的问题
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- C++ 迭代后销毁对象的问题
- "Extern"对象问题:错误:Id 返回 1 个退出状态
- 将文件从 iOS 应用程序加载到 C++ 对象中/<iostream>iOS 上的问题
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 与 32 位共享对象的链接问题