在C ++中对非POD类型使用sizeof运算符是否安全

时间:2016-07-08 11:52:55

标签: c++

在C ++中对非POD类型使用sizeof运算符是否安全?这个值会大于或等于其所有成员的大小吗?

3 个答案:

答案 0 :(得分:6)

当然这很安全。另请注意,sizeof编译时进行评估。

{P}类型的sizeof永远不会,而不是所有成员的总大小,除了任何空的基类优化。

由于包装安排以及没有成员的班级将具有非零sizeof的事实,它可能更大比其所有成员的总数更多

答案 1 :(得分:2)

是。 Sizeof保证返回足够的字节来保存对象,包括任何填充和其他类型的“隐藏”字段,例如用于序列化它的填充。

也许唯一需要注意的是,在编译时进行评估,它不是polimorphic。 也就是说,

class Base
{
    int x;
};

class Derived : public Base
{
    int y;
};

int main()
{
    Base* k = new Derived;

    return sizeof(*k)/sizeof(int);
}

返回1而不是2,即它在正式类型Base上进行求值,即使该对象在运行时实际上是Derived

答案 2 :(得分:2)

根据工作草案,[5.3.3/2]

  

当应用于类时,结果是该类的对象中的字节数,包括在数组中放置该类型的对象所需的任何填充。最派生类的大小应大于零。将sizeof应用于基类子对象的结果是基类类型的大小。

Here与最后一句相关的脚注:

  

基类子对象的实际大小可能小于将sizeof应用于子对象的结果,这是由于虚基类和对基类子对象的填充要求不太严格。

所以:是的,它是安全的,结果或多或少大于或等于其所有成员的大小