Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Pimpl的高级变体时可能会影响性能?_C++_Pimpl Idiom - Fatal编程技术网

C++ 使用Pimpl的高级变体时可能会影响性能?

C++ 使用Pimpl的高级变体时可能会影响性能?,c++,pimpl-idiom,C++,Pimpl Idiom,想象一下 我想创建不公开任何底层实现的类。甚至这也不意味着有一个指向实现的指针 我会用一个全局对象池来实现这一点 像这样的 在类TestImpl中实现的类测试 构建测试时,它会在全局对象池中为自己创建一个TestImpl 对象池基本上是每种类型的映射。键是测试实例的内存地址,值是相应的TestImpl。因此,每次调用Test上的成员函数时,它首先从对象池中获取相应的TestImpl,使用this指针作为键 当然,这种对象池必须同步,需要锁 您认为这样的解决方案会对性能造成多大的影响?ifc.h

想象一下

我想创建不公开任何底层实现的类。甚至这也不意味着有一个指向实现的指针

我会用一个全局对象池来实现这一点

像这样的

在类TestImpl中实现的类测试

构建测试时,它会在全局对象池中为自己创建一个TestImpl

对象池基本上是每种类型的映射。键是测试实例的内存地址,值是相应的TestImpl。因此,每次调用Test上的成员函数时,它首先从对象池中获取相应的TestImpl,使用this指针作为键

当然,这种对象池必须同步,需要锁

您认为这样的解决方案会对性能造成多大的影响?

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();
}

表演什么?您已经明确表示,您可能会在“对象池”上遇到锁争用。正如您在这里描述的那样实现,并且假设有一个相当丰富的多线程环境(您在文章中没有指定),它看起来像是一种高概率的机制,几乎压制了任何并行性的希望。因此,编写代码并找出答案。如果要完全隐藏实现,则只能在头文件中提供纯虚拟接口,并提供一个工厂来检索实现。性能影响取决于调用次数与每次调用所用时间(一如既往)以及池的大小和实现。