出于性能原因,我想通过一次调用memcpy
来复制CB类成员中CA类的所有成员。
在基本形式中,我认为它是可能的,因为它们都是仅包含指针的类CPtr
的成员。
如果我使用boost::shared_ptr
或std::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_;
};
答案 0 :(得分:5)
由于CPtr
不是POD(它具有带虚函数的基类),因此您无法通过memcpy
合法地复制它。因此,这样做是一个非常糟糕的主意。
答案 1 :(得分:0)
使用memcpy
没有性能原因。在可以使用memcpy
的地方,复制构造函数同样有效。
另外,复制构造函数将适用于您的情况,而memcpy
则不会。 memcpy
只能用于“普通旧数据”(POD)类型,这些类型仅使用普通C中可用的功能以及可能的非虚拟方法。继承,虚拟成员,构造函数和析构函数都会使你的对象成为非POD,而你实际上拥有它们。