2014-10-01 105 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(); 
} 
相关问题