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

时间:2017-07-22 12:52:12

标签: c++

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

我知道对于课程,在确定大小时可能还需要考虑一些,但是正在计算所有数据成员的总和,以正确的方式找到所有类的最小大小类型,除了工会?

4 个答案:

答案 0 :(得分:4)

这个useful utility名为sizeof。它只是为您提供传递的类型或表达式的编译时大小。

让编译器为您处理。甚至不评估表达式,结果可以在constexpr环境中使用。它还处理平台特定的差异。

class Example {
  int member;
  const char* otherMember;
};

const int size = sizeof(Example);

回答实际问题:

  

您可以在某种程度上确定除联合之外的类类型的大小   同样的方式......?

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

  

...比如计算所有数据成员的总和?

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

  

正在计算正确方式所有数据成员的总和来查找   所有类类型的最小尺寸,除了工会?

这将是一个保守估计,可能小于实际大小。所以它不是正确的方式。很难明白为什么如果你可以真正没有成本的话就可以使用它。它也适用于工会,指针,表达。便携式。

答案 1 :(得分:1)

是的,如果你想为一个班级的大小做一个下限,那么其成员的总和大小就可以了。

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

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

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

因此,例如,此类通常具有sizeof 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

答案 2 :(得分:0)

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

从更理论的角度来看,加上成员的大小会告诉你班级的大小。对于工会来说,它或多或少是一样的。获取每个替代项的对象大小。然后最大的胜利。

答案 3 :(得分:0)

  

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

不,你不能。

  

我知道对于课程,在确定大小时可能需要考虑一些......

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

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

Size Derived1: 4
Size Derived2: 16

输出

var diff = (float)(x+dx+1f) - 1f;

(现场直播here

  

...但是正在计算所有数据成员的总和,以正确的方式查找除联合之外的所有类类型的最小大小?

说到绝对最小尺寸是的。但是即使你把#pragma pack(1)之类的编译器编译器用来消除对齐和填充,只需总结数据成员就不会为虚拟多态等其他考虑因素提供最小尺寸