2014-10-01 67 views
0

想象一下。使用Pimpl的高級版本時性能可能會受到影響嗎?

我想創建不公開任何底層實現的類。甚至沒有一個指向實現的指針。

我會用全局對象池做到這一點。

就是這樣。

一個類TestImpl類中實現的測試。

當構造Test時,它會在全局對象池中爲自己創建一個TestImpl。

對象池基本上是每種類型的地圖。關鍵將是Test實例的內存地址,並且該值將是相應的TestImpl。所以每次調用Test的成員函數時,它都會首先從對象池中獲取相應的TestImpl,並使用該指針作爲關鍵字。

這種對象池當然必須是同步的,需要鎖。

您認爲這樣的解決方案會產生多大的性能?

+0

表現爲* *什麼?您已經清楚地表明您可能會在「對象池」上發生鎖定爭用。如你在這裏所描述的那樣執行,並假設一個相當豐富的多線程環境(你沒有在你的文章中指定),它看起來像是一種高概率機制,它可以壓制任何並行的希望。所以編碼並找出答案。 – WhozCraig 2014-10-01 10:33:26

+1

如果您想完全隱藏實現,那麼您只能在頭文件中提供純虛擬接口並提供工廠來檢索實現。 – Galik 2014-10-01 10:43:41

+0

性能影響取決於調用次數與每次調用所花費的時間(如往常一樣),以及池的大小和實現。 – 2014-10-01 10:46:24

回答

2

ifc.h

struct ifc { 
    virtual ~ifc() {} 
    virtual void api() = 0; 

    static ifc* create(); 
}; 

impl.cc

#include "ifc.h" 

struct impl: ifc { 
    virtual void api() override; 
} 

void impl::api() { 
    // code here 
} 

ifc* ifc::create() { 
    // or use shared pointer/untrusive pointer and return object back to a pool 
    // if dynamic memory allocation is not desired (but rather just keep it simple 
    // and plug something like TCMalloc first (which does low level pooling) 
    // and see if it gets better) 
    return new impl(); 
} 
相關問題