在C ++中使用对象或使用对象指针进行类聚合

时间:2014-01-16 16:07:05

标签: c++

假设类ABC和类DEF具有聚合关系,然后我们可以通过以下两种方式定义类ABC

解决方案1 ​​

class ABC
{
  public:

    ABC() {};
    ~ABC() {};

    DEF defObj;
};

解决方案2

 class DEF;
 class ABC
{
  public:

    ABC();  
    ~ABC(); 

    std::unique_ptr<DEF> pdefObj;
};

ABC::ABC()
{
  pdefObj = new DEF();
}
ABC::~ABC()
{
}

然后我的问题是在哪种情况下解决方案1优于解决方案2.我理解解决方案2在编译方面具有优势。

1 个答案:

答案 0 :(得分:2)

我只是将解决方案1视为默认选择,即使用数据成员({1}}的实例,而不是DEF

首先,解决方案#1的代码是最简单的。它也更有效,因为您没有无用的堆分配(unique_ptr<DEF>所需)。堆分配意味着转到内存管理器,在这种情况下这是不必要的成本。

此外,如果您的数据成员是指针,则您的位置更差(即缓存更少的内存布局,性能更差)。

只考虑解决方案#1,除非你为#2提供了一些非常好的理由。 (使用unique_ptr私有数据成员的示例是PIMPL惯用法,但似乎不是您的情况,因为您将unique_ptr<SomePrivateState>公开为公开你班级的元素。)