【发布时间】: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 个字节的虚函数时,会创建一个指针。
这个指针是只针对具有虚函数的类,还是派生类。
我计算大小的顺序是什么。如果我在计算 D 的大小,我会先计算 A 的大小,然后是 C,然后是 D?
struct
DCA具有与 D 类相同的变量,但是它的大小是 24,而类D的大小是 32。我预计D也是 24,因为我正在计算浮点数首先是 16 个字节,然后是指针的 8 个字节。 24 可以被 8 整除,8 字节对齐。
有人可以尝试回答这些问题并告诉我我的逻辑哪里出了问题吗?
重复的问题不涉及虚拟关键字、继承或计算顺序。它也没有提到是否有标准的特定字节对齐方式。
【问题讨论】:
-
FWIW,你在实现定义的土地上。除了标准布局类之外,该标准实际上没有关于类大小的任何内容。很难给你一个明确的答案,因为这取决于你的实现和代码。事实上,如果编译器可以证明它知道运行时类型,你甚至不会有虚拟调用,因为它可以优化它。
-
@NathanOliver 让我们假设它没有被优化掉,它只是我发布的代码。我只是想了解它是如何计算的,即是否有特定的顺序完成(这可能会导致填充)。就像在 B 之前计算 A,然后添加 B,8 字节对齐会有额外的填充。