C++类成员和内存位置

C++ class members and memory position

本文关键字:内存 位置 成员 C++      更新时间:2023-10-16

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

在基本形式中,我认为这是可能的,因为它们都是只包含指针的类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_;
 };

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

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

另外,复制构造函数将在您的情况下工作,而memcpy则不起作用。 memcpy只能用于"普通旧数据"(POD)类型,这些类型仅使用纯C和可能的非虚拟方法中可用的功能。继承、虚拟成员、构造函数和析构函数都使您的对象成为非 POD,而您实际上拥有所有这些对象。