2010-11-07 450 views
2

我经常声明类包装单个Plain Old Data值;简单的类没有虚拟功能,如:C++:POD和POD包装对象

class Velocity { 
    int vel; 
public: 
    // functions to work with velocity ... 
} 
  1. 与这样的对象的工作是相同的与POD的值工作? - 如果在我的代码中使用了int而不是Velocity,那么空间或时间使用情况是否有所不同?标准是否对此有所说明?

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

回答

4

与这样的对象的工作是相同的与POD的值工作?

不,您使用memcpy和其上的朋友并不完全安全(只允许使用POD!)。

我可以将一个指针或这样的对象的数组作为POD值的指针/数组吗?

如果它是一个POD,你是绝对安全的。但这不是POD,因为它有一个私人数据成员。


双方的这一说,在实践中它会正常工作的类(C++ 0x中,你允许使用这样一类具有私有成员memcpy,因为它允许所有可复制类型,包括您的类型和许多其他非POD)。

1

1)您的例子并不POD,因为类有私有字段

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

4

“与POD相同”,不完全在C++ 98中。 C++ 98不允许POD拥有私有成员。 C++ 0x提升了这个限制(和其他一些限制)。

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

要求您的编译器进行优化,然后进行测量,如果它很重要。

重铸:否,具有实现定义的效果。不要这样做。

Cheers & hth。,