C ++类成员和内存位置

时间:2014-03-04 12:46:06

标签: c++ shared-ptr memcpy memory-alignment

出于性能原因,我想通过一次调用memcpy来复制CB类成员中CA类的所有成员。

在基本形式中,我认为它是可能的,因为它们都是仅包含指针的类CPtr的成员。

如果我使用boost::shared_ptrstd::shared_ptr之类的东西而不是指针会怎么样?

这个想法是否有意义,我是否可以获得& a_和& c_的地址,计算偏移量并memcpy到& f_?

 class CBase {
   virtual ~CBase(){}
 };

 class CPtr : public CBase{
   int* p_; // what If I have shared_ptr<int> p_; ?
 };

 class CA {
 public:
    CPtr a_;
    CPtr b_;
    CPtr c_;
 };

 class CB {
 public:
    CPtr e_;
    CPtr f_;
    CPtr g_;
 };

2 个答案:

答案 0 :(得分:5)

由于CPtr不是POD(它具有带虚函数的基类),因此您无法通过memcpy合法地复制它。因此,这样做是一个非常糟糕的主意。

答案 1 :(得分:0)

使用memcpy没有性能原因。在可以使用memcpy的地方,复制构造函数同样有效。

另外,复制构造函数将适用于您的情况,而memcpy则不会。 memcpy只能用于“普通旧数据”(POD)类型,这些类型仅使用普通C中可用的功能以及可能的非虚拟方法。继承,虚拟成员,构造函数和析构函数都会使你的对象成为非POD,而你实际上拥有它们。