2014-01-16 160 views
1

假設類ABCDEF類類聚合具有聚合關係,然後我們可以通過以下兩種方式來定義ABC類:與對象或在C++對象指針

溶液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好。 d解決方案2在編譯時具有優勢。

+0

你不會能夠複製第二個。 –

回答

2

我只考慮解決方案1的默認選擇,即使用數據成員是DEF的實例,而不是unique_ptr<DEF>

首先,解決方案#1的代碼是最簡單的。由於您沒有無用的堆分配(由unique_ptr要求),因此它也更高效。堆分配意味着下降到內存管理器,在這種情況下這是不必要的成本。而且,如果你的數據成員是一個指針,那麼你的局部性就會變差(即緩存友好的內存佈局減少,性能變差)。

只要考慮解決方案#1,除非你有很好的理由#2。 (與使用unique_ptr<SomePrivateState>一個私人數據成員的一個例子是PIMPL方法,但似乎沒有你的情況下,因爲你是暴露DEF爲您的類的公共元素