在C+中的非POD类型上使用sizeof运算符是否安全+; 在C++中使用 >代码>操作符对非POD类型安全吗?该值是否大于或等于其所有成员的大小?
当然是安全的。还要注意,在C+中的非POD类型上使用sizeof运算符是否安全+; 在C++中使用 >代码>操作符对非POD类型安全吗?该值是否大于或等于其所有成员的大小?,c++,C++,当然是安全的。还要注意,sizeof是在编译时计算的 非POD类型的大小永远不会小于其所有成员大小的总和,任何空基类优化除外 它很可能大于其所有成员的大小之和,这是由于打包安排和一个没有成员的类的sizeof非零这一事实。Sizeof保证返回足够的字节来保存对象,包括任何填充和其他类型的“隐藏”字段,例如用于序列化对象的填充 可能唯一需要注意的是,在编译时对其求值时,它不是polymorphic。 就是 class Base { int x; }; class Derived : pu
sizeof
是在编译时计算的
非POD类型的大小永远不会小于其所有成员大小的总和,任何空基类优化除外
它很可能大于其所有成员的大小之和,这是由于打包安排和一个没有成员的类的sizeof非零这一事实。Sizeof保证返回足够的字节来保存对象,包括任何填充和其他类型的“隐藏”字段,例如用于序列化对象的填充
可能唯一需要注意的是,在编译时对其求值时,它不是polymorphic。
就是
class Base
{
int x;
};
class Derived : public Base
{
int y;
};
int main()
{
Base* k = new Derived;
return sizeof(*k)/sizeof(int);
}
返回1
而不是2
,也就是说,即使对象在运行时实际上是一个派生的,它也会计算为其形式类型Base
。根据工作草案:
应用于类时,结果是该类的对象中的字节数,包括将该类型的对象放置在数组中所需的任何填充。最派生类的大小应大于零。将sizeof应用于基类子对象的结果是基类类型的大小
与最后一句有关的脚注:
由于虚拟基类和基类子对象的填充要求不太严格,基类子对象的实际大小可能小于将sizeof应用于子对象的结果
所以:是的,它是安全的,结果或多或少大于或等于其所有成员的大小。如果不知道数据类型,它肯定是不安全的。你可以随时查看空基类优化的情况如何?@NathanOliver:是的,这很有趣,但你能想出一个实际得到零的例子吗sizeof
?在任何这样的情况下,我认为空的基类优化都是不允许的。但我希望在这一点上被证明是错误的:周末要仔细考虑的事情。不是真的为sizeof(X)==0,而是。整体比部分少。是的,这是一个很好的观点。我请客。我记下了你的评论,没问题。我很好奇,所以我不得不测试它。谢谢你添加它。我要一杯苏格兰威士忌;-)