c++ - 使用 virtual 关键字和继承时,如何在 C++ 中确定类大小?
问题描述
我试图完全理解 C++ 中类大小是如何确定的,因此在设计数据结构时我可以牢记这一点。我有一些我为测试而创建的类,但似乎在某些尺寸上很挣扎,可能是因为不知道尺寸加在一起的顺序。
在 64 位编译中考虑以下内容
class A {
public:
virtual void work() {}
private:
float a;
float b;
};
class B : A {
private:
float b1;
};
class C : A {
private:
float c1;
};
class D : C {
private:
float d1;
};
struct DCA {
float d1;
float c1;
float a;
float b;
void* function;
};
int main()
{
std::cout << sizeof(A) << std::endl;//16
std::cout << sizeof(B) << std::endl;//24
std::cout << sizeof(C) << std::endl;//24
std::cout << sizeof(D) << std::endl;//32
std::cout << sizeof(DCA) << std::endl;//24;
}
现在我明白了当使用一个在 64 位上增加 8 个字节的虚函数时会创建一个指针。
这个指针是只针对具有虚函数的类,还是派生类。
我计算大小的顺序是什么。如果我在计算 D 的大小,我会先计算 A 的大小,然后是 C,然后是 D?
struct
DCA
具有与类 D 相同的变量,但是它的大小是 24,类的大小D
是 32。我本来也希望D
是 24,因为我首先计算浮点数,即 16 个字节,然后是指针的 8 个字节. 24 可以被 8 整除,8 字节对齐。
有人可以尝试回答这些问题并告诉我我的逻辑哪里出了问题吗?
重复的问题不涉及虚拟关键字、继承或计算顺序。它也没有提到是否存在标准的特定字节对齐。
解决方案
这个指针是只针对具有虚函数的类,还是派生类。
由于派生类包含基类作为其子对象,派生类也具有指向 vtable 的指针。
我计算大小的顺序是什么。如果我在计算 D 的大小,我会先计算 A 的大小,然后是 C,然后是 D?
从基础到派生。对于多个基类,从左到右。这是因为第一个成员前面没有填充。
struct DCA 具有与 D 类相同的变量
它们的大小相同,即 24 字节。
推荐阅读
- python - 如何在python中发回结果并关闭套接字
- c - 如何在C中传输int变量地址?
- amazon-web-services - AWS CloudWatch Logs Insights 警报
- python - boto过滤器中的Python比较运算符
- sql - 用于从列中减去值并将其添加到同一行的 SQL 查询
- python - 使用 **requests.get** 和 python 来处理 HTTP 重定向?
- javascript - `chrome.storage.sync.get (['auth'] ... `content.js` 中的 `Alert` 返回一个空对象
- sql - 同一查询中的 CTE 和 @table
- apache - netstat 命令(net-tools)未生成预期响应
- azure-iot-hub - 在部署中继承孪生设置 - Azure IoT Edge