假设类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在编译方面具有优势。
答案 0 :(得分:2)
我只是将解决方案1视为默认选择,即使用数据成员({1}}的实例,而不是DEF
。
首先,解决方案#1的代码是最简单的。它也更有效,因为您没有无用的堆分配(unique_ptr<DEF>
所需)。堆分配意味着转到内存管理器,在这种情况下这是不必要的成本。
此外,如果您的数据成员是指针,则您的位置更差(即缓存更少的内存布局,性能更差)。
只考虑解决方案#1,除非你为#2提供了一些非常好的理由。
(使用unique_ptr
的私有数据成员的示例是PIMPL惯用法,但似乎不是您的情况,因为您将unique_ptr<SomePrivateState>
公开为公开你班级的元素。)