你能用同样的方式确定所有类类型的大小吗?
Can you determine the size of all class types in the same way?
你能用某种相同的方式确定类类型的大小,除了联合,就像计算所有数据成员的总和一样吗?
我知道对于类,在确定大小时可能还需要考虑更多,但是计算所有数据成员的总和是找到除联合之外的所有类类型最小大小的正确方法吗?
有一个有用的实用程序叫做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)
这样的编译器编译指示来消除对齐和填充,仅汇总数据成员也不会为其他考虑(如虚拟多态性(提供最小大小。
- C++以迭代方式搜索混合类型地图
- 如何以"union-like"方式更改C++向量的数据类型
- 具有调整对齐方式的类型定义
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 哈希多态类型的正确方式
- 这种抽象模板矩阵类数据类型的方式好吗?
- 你能用同样的方式确定所有类类型的大小吗?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 如何以类型的安全方式分配UINT32_T :: MAX和UINT64_T的最小值
- 如何以可移植方式删除名称为 wchar_t 类型的文件C++
- 如何在没有动态调用的情况下确定子节点的类型
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 有什么优雅的方式吗?(类型参数包)
- 以更健壮和类型安全的方式处理ASCII命令
- 为什么这个浮点类型的值以这种方式输出
- 以符合标准的方式用与数组相同类型的成员重新解释结构
- 幻影类型是否与原始类型具有相同的对齐方式
- 以最新的C 的类型安全方式从枚举中随机选择元素
- 类型转换C++的行为方式很奇怪