Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中的非POD类型上使用sizeof运算符是否安全+; 在C++中使用 >代码>操作符对非POD类型安全吗?该值是否大于或等于其所有成员的大小?_C++ - Fatal编程技术网

在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,而是。整体比部分少。是的,这是一个很好的观点。我请客。我记下了你的评论,没问题。我很好奇,所以我不得不测试它。谢谢你添加它。我要一杯苏格兰威士忌;-)