你能用同样的方式确定所有类类型的大小吗?

Can you determine the size of all class types in the same way?

本文关键字:类型 方式确      更新时间:2023-10-16

你能用某种相同的方式确定类类型的大小,除了联合,就像计算所有数据成员的总和一样吗?

我知道对于类,在确定大小时可能还需要考虑更多,但是计算所有数据成员的总和是找到除联合之外的所有类类型最小大小的正确方法吗?

有一个有用的实用程序叫做sizeof。它只是为您提供传入的类型或表达式的编译时大小。

让编译器为您处理它。并且表达式甚至没有被计算,结果可以在constexpr环境中使用。此外,它还处理特定于平台的差异。

class Example {
int member;
const char* otherMember;
};
const int size = sizeof(Example);

要回答实际问题:

你能确定类类型的大小,除了联合,在某种程度上 同样的方式... ?

答案是肯定的,您可以使用sizeof,并且

。喜欢计算所有数据成员的总和?

不,它可能不一样。您可以这样做,但它可能与实际大小有很大不同。此外,一些基本类型在某些平台上可以有不同的大小,您可能最好也为它们使用 sizeof,在这种情况下,您可以为整个类执行此操作。

计算所有数据成员的总和是找到除工会外,所有类类型的最小规模?

这将是一个保守的估计,可能小于实际大小。所以这不是正确的方法。很难看出,如果你能免费拥有真实的东西,为什么它会有任何用处。它还适用于联合、指针、表达式。而且便携。

是的,如果你想为类的大小设定一个下限,那么它的成员的总和大小就可以了。

没有虚函数的类通常具有其成员的总和,以及成员之间的填充。由于对齐,填充通常放在成员之间。

具有虚函数的类通常有一个隐藏的sizeof(void*)大小成员(指向虚拟表的指针(。

具有虚拟继承的类通常可以有更多隐藏的东西。

因此,例如,此类的大小通常为 8(其中sizeof(int)为 4(:

struct Foo {
char c; // there is a 3-byte padding between c and i, because i
int i;  // is need a 4-aligned address
};

注意:这些东西没有在标准中指定,任何编译器实现都可能以不同的方式工作。如果需要类的权威大小,请使用sizeof

确定 C++ 中对象大小的正确方法是使用 sizeof 运算符。

从更理论的角度来看,是的,将成员的大小相加将告诉您班级的大小。对于工会来说,情况或多或少是相同的。获取每个备选方案的对象大小。然后最大的胜利。

您能否以某种相同的方式确定类类型(联合除外(的大小,例如计算所有数据成员的总和?

不,你不能。

我知道对于类,在确定大小时可能还需要考虑更多......

是的,还有更多的事情需要考虑。首先对齐数据成员和填充。

还涉及虚拟多态性可能会影响类的大小,让我们看一个小例子:

#include <iostream>
class Base1 {
public:
void foo() {}
};
class Derived1 : public Base1 {
int i;
public:
void foo() {}
};
class Base2 {
public:
virtual ~Base2() {}
virtual void foo() = 0;
};
class Derived2 : public Base2 {
int i;
public:
virtual ~Derived2() {}
virtual void foo() {}
};
int main() {
std::cout << "Size Derived1: " << sizeof(Derived1) << std::endl;
std::cout << "Size Derived2: " << sizeof(Derived2) << std::endl;
}

输出为

Size Derived1: 4
Size Derived2: 16

(在这里观看直播(

。但是,计算所有数据成员的总和是找到除联合之外的所有类类型最小大小的正确方法吗?

说到绝对最小尺寸是的。但是,即使您使用像#pragma pack(1)这样的编译器编译指示来消除对齐和填充,仅汇总数据成员也不会为其他考虑(如虚拟多态性(提供最小大小