首页 > 解决方案 > 使用 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 个字节的虚函数时会创建一个指针。

  1. 这个指针是只针对具有虚函数的类,还是派生类。

  2. 我计算大小的顺序是什么。如果我在计算 D 的大小,我会先计算 A 的大小,然后是 C,然后是 D?

  3. structDCA具有与类 D 相同的变量,但是它的大小是 24,类的大小D是 32。我本来也希望D是 24,因为我首先计算浮点数,即 16 个字节,然后是指针的 8 个字节. 24 可以被 8 整除,8 字节对齐。

有人可以尝试回答这些问题并告诉我我的逻辑哪里出了问题吗?

在此处输入图像描述


重复的问题不涉及虚拟关键字、继承或计算顺序。它也没有提到是否存在标准的特定字节对齐。

标签: c++memorysizeof

解决方案


这个指针是只针对具有虚函数的类,还是派生类。

由于派生类包含基类作为其子对象,派生类也具有指向 vtable 的指针。

我计算大小的顺序是什么。如果我在计算 D 的大小,我会先计算 A 的大小,然后是 C,然后是 D?

从基础到派生。对于多个基类,从左到右。这是因为第一个成员前面没有填充。

struct DCA 具有与 D 类相同的变量

它们的大小相同,即 24 字节。


推荐阅读