您能否以类似的方式确定类类型的大小(联合除外),例如计算所有数据成员的总和?
我知道对于课程,在确定大小时可能还需要考虑一些,但是正在计算所有数据成员的总和,以正确的方式找到所有类的最小大小类型,除了工会?
答案 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)
之类的编译器编译器用来消除对齐和填充,只需总结数据成员就不会为虚拟多态等其他考虑因素提供最小尺寸。