unique_ptr 的有状态自定义删除器

塞尔吉·罗加奇

我正在使用内存池来实现更快的分配和释放。内存池的Release()操作需要释放的指针和分配的字节数。

现在我想将从内存池获得的数组指针存储在unique_ptr. 数组大小可变,所以我需要一个有状态的自定义删除器来存储数组的大小。

您能否提供有关如何声明此类的示例代码unique_ptr

更新:在 Artyer 的提示让我清楚之后,这是我尝试过的:

template<typename T> struct MPSingleDeleter {
  void operator()(T *p) {
    p->~T();
    MemPool::Instance().Release(p, sizeof(T));
  }
};

template<typename T> struct MPArrayDeleter {
  size_t _nItems;

  explicit MPArrayDeleter(const size_t nItems) : _nItems(nItems) {
  }

  void operator()(T *p) {
    for (size_t i = 0; i < _nItems; i++) {
      p[i].~T();
    }
    MemPool::Instance().Release(p, _nItems * sizeof(T));
  }
};

template <typename T> using SingleUP = std::unique_ptr<T, MPSingleDeleter<T>>;
template <typename T> using ArrayUP = std::unique_ptr<T[], MPArrayDeleter<T>>;

struct MemHelper {
  template<typename T, typename ...Args>  static T* NewSingle(Args&&... args) {
    void * const p = MemPool::Instance().Acquire(sizeof(T));
    ::new (p) T(std::forward<Args>(args)...);
    return static_cast<T*>(p);
  }

  template<typename T, typename ...Args> static T* NewArray(const size_t nItems, Args&&... args) {
    T *p = static_cast<T*>(MemPool::Instance().Acquire(nItems * sizeof(T)));
    for (size_t i = 0; i < nItems; i++) {
      void * const pv = static_cast<void *>(p + i);
      ::new (pv) T(std::forward<Args>(args)...);
    }
    return p;
  }

  template<typename T, typename ...Args> static SingleUP<T> MakeSUP(Args&&... args) {
    return SingleUP<T>(NewSingle<T>(std::forward<Args>(args)...));
  }

  template<typename T, typename ...Args> static ArrayUP<T> MakeAUP(const size_t nItems, Args&&... args) {
    return ArrayUP<T>(NewArray<T>(nItems, std::forward<Args>(args)...), MPArrayDeleter<T>(nItems));
  }
};

现在unique_ptr变量的声明很简单:

// Array of double
ArrayUP<double> pBuffer = MemHelper::MakeAUP<double>(2ui64 * nItems);
// Single Connection
SingleUP<Connection> pConn = MemHelper::MakeSUP<Connection>(ioContext);
阿特尔

您通常会在内存池中分配数据之前存储大小,因此您只需传递一个从指针获取大小的无状态删除器。

不过,您可以轻松地执行以下操作:

#include <memory>

struct pool_deleter {
    std::size_t size;

    template<class T>
    void operator()(T* ptr) noexcept {
        std::destroy_n(ptr, size);
        Release(ptr, size * sizeof(T));
    }
};

template<class T>
using pool_ptr = std::unique_ptr<T, pool_deleter>;

// Used like:
std::size_t n = /* ... */;
T* ptr_ = /* Allocate and construct n objects from pool  */;
pool_ptr<T> ptr{ptr_, pool_deleter{n}};  // Pass the custom deleter as an argument

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将具有自定义删除器的unique_ptr移到shared_ptr

来自分类Dev

具有自定义删除器的unique_ptr构造函数被删除

来自分类Dev

使用带有unique_ptr的自定义删除器

来自分类Dev

std :: unique_ptr使用带有很少参数的自定义删除器

来自分类Dev

删除函数unique_ptr

来自分类Dev

删除函数unique_ptr

来自分类Dev

unique_ptr,自定义删除器和零规则

来自分类Dev

混淆使用unique_ptr和自定义删除器

来自分类Dev

用unique_ptr和自定义删除器包装C代码

来自分类Dev

std :: unique_ptr <T []>和自定义分配器删除器

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

C ++ 11使用unique_ptr和自定义删除器

来自分类Dev

了解采用自定义删除器的unique_ptr的构造函数

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

初始化传递给unique_ptr自定义删除器的函子

来自分类Dev

使用typedef为std :: unique_ptr指定自定义默认删除器

来自分类Dev

std :: unique_ptr,自定义删除器和类型更改

来自分类Dev

如何为由 unique_ptr 管理的数组编写自定义删除器?

来自分类Dev

具有自定义删除程序类的STL向量和unique_ptr

来自分类Dev

带有lambda自定义删除程序的std :: unique_ptr无法编译

来自分类Dev

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

来自分类Dev

配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

来自分类Dev

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

来自分类Dev

使用已删除的函数unique_ptr

来自分类Dev

类型定义的unique_ptr列表

来自分类Dev

具有虚拟类的unique_ptr

来自分类Dev

unique_ptr有什么意义?

来自分类Dev

具有unique_ptr的结构向量

来自分类Dev

具有虚拟类的unique_ptr

Related 相关文章

  1. 1

    将具有自定义删除器的unique_ptr移到shared_ptr

  2. 2

    具有自定义删除器的unique_ptr构造函数被删除

  3. 3

    使用带有unique_ptr的自定义删除器

  4. 4

    std :: unique_ptr使用带有很少参数的自定义删除器

  5. 5

    删除函数unique_ptr

  6. 6

    删除函数unique_ptr

  7. 7

    unique_ptr,自定义删除器和零规则

  8. 8

    混淆使用unique_ptr和自定义删除器

  9. 9

    用unique_ptr和自定义删除器包装C代码

  10. 10

    std :: unique_ptr <T []>和自定义分配器删除器

  11. 11

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  12. 12

    C ++ 11使用unique_ptr和自定义删除器

  13. 13

    了解采用自定义删除器的unique_ptr的构造函数

  14. 14

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  15. 15

    初始化传递给unique_ptr自定义删除器的函子

  16. 16

    使用typedef为std :: unique_ptr指定自定义默认删除器

  17. 17

    std :: unique_ptr,自定义删除器和类型更改

  18. 18

    如何为由 unique_ptr 管理的数组编写自定义删除器?

  19. 19

    具有自定义删除程序类的STL向量和unique_ptr

  20. 20

    带有lambda自定义删除程序的std :: unique_ptr无法编译

  21. 21

    Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

  22. 22

    配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

  23. 23

    Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

  24. 24

    使用已删除的函数unique_ptr

  25. 25

    类型定义的unique_ptr列表

  26. 26

    具有虚拟类的unique_ptr

  27. 27

    unique_ptr有什么意义?

  28. 28

    具有unique_ptr的结构向量

  29. 29

    具有虚拟类的unique_ptr

热门标签

归档