C ++:POD和POD包装对象

时间:2010-11-07 21:52:33

标签: c++ pod

我经常声明类包装一个Plain Old Data值;没有虚函数的简单类,如:

class Velocity {
    int vel;
public:
    // functions to work with velocity ...
}
  1. 使用此类对象与使用POD值相同? - 空间或时间使用是否有任何差异,如果在我的代码中我使用的是int,而不是Velocity?标准是否对此有所说明?

  2. 我可以将指针或数组这样的对象转换为POD值的指针/数组,反之亦然? - 我是否完全安全Velocity *v = reinterpret_cast< Velocity* >( int_pointer )

3 个答案:

答案 0 :(得分:4)

  

使用此类对象与使用POD值相同吗?

没有。使用memcpy和朋友就不完全安全(只允许在POD上使用!)。

  

我可以将指针或数组这样的对象转换为POD值的指针/数组,反之亦然?

如果它是POD,那么你就完全安全了。但这不是POD,因为它有一个私有数据成员。


两者都说,实际上它适用于 类(在C ++ 0x中,你 允许使用这样具有memcpy私有成员的类,因为它允许所有简单的可复制类型,包括您的类型和许多其他非POD)。

答案 1 :(得分:4)

Re“与POD相同”,并非完全在C ++ 98中。 C ++ 98不允许POD拥有私有成员。 C ++ 0x解除了这个限制(以及其他一些限制)。

效率或缺乏效率,这是一个实施质量问题。

让你的编译器进行优化,然后测量它是否重要。

重新铸造:不,具有实施定义的效果。不要这样做。

干杯&amp;第h。,

答案 2 :(得分:1)

1)您的示例不是POD,因为该类具有私有字段

2)标准没有定义使用reinterpret_cast时会发生什么。发生的任何事情都是实现定义的。