我经常声明类包装一个Plain Old Data值;没有虚函数的简单类,如:
class Velocity {
int vel;
public:
// functions to work with velocity ...
}
使用此类对象与使用POD值相同? - 空间或时间使用是否有任何差异,如果在我的代码中我使用的是int
,而不是Velocity
?标准是否对此有所说明?
我可以将指针或数组这样的对象转换为POD值的指针/数组,反之亦然? - 我是否完全安全Velocity *v = reinterpret_cast< Velocity* >( int_pointer )
?
答案 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时会发生什么。发生的任何事情都是实现定义的。