【问题标题】:How is a class size determined in C++ when using the virtual keyword and inheritance?使用 virtual 关键字和继承时,如何在 C++ 中确定类大小?
【发布时间】:2019-02-25 23:38:06
【问题描述】:

我试图完全理解 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. struct DCA 具有与 D 类相同的变量,但是它的大小是 24,而类 D 的大小是 32。我预计 D 也是 24,因为我正在计算浮点数首先是 16 个字节,然后是指针的 8 个字节。 24 可以被 8 整除,8 字节对齐。

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


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

【问题讨论】:

标签: c++ memory sizeof


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • D 怎么有 5 个浮点数?我只看到d1c1ab
  • @jjmcc 我的错误。
  • 在这种情况下,为什么DCAD 的大小不同?我认为这是因为计算C 时的填充?另外,一旦添加了指针,是否意味着后面的所有内容都必须是 8 字节对齐的?
  • 虽然它们的大小似乎不一样...如果我运行 OP 中发布的代码,我会得到 32D24DCA。如果我在 32 位中运行,那么两者都会得到 20,但在 64 位中它们会有所不同。
  • 不适合我。我使用的是 Visual Studio 2017。不同的编译器会产生不同的结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2014-02-27
  • 2014-12-01
  • 2023-03-22
相关资源
最近更新 更多