C++ 库 - <memory_resource>



C++17 中的<memory_resource> 头文件引入了一组类和函数来支持多态内存资源。它通过将内存管理机制抽象到可定制的内存资源类中,提供了一种灵活的内存分配和释放方式。

<memory_resource> 的能力在于它将内存分配逻辑与容器和算法解耦,从而能够控制内存管理。该库的核心是 std::pmr::memory_resource 类,它定义了内存分配的抽象接口。然后,这些内存资源可以与支持多态分配器的容器一起使用,例如 std::pmr::vector、std::pmr::string 等。

包含 <memory_resource> 头文件

要在 C++ 程序中包含 <memory_resource> 头文件,可以使用以下语法。

#include <memory_resource>

<memory_resource> 头文件的函数

以下是 <memory_resource> 头文件中所有函数的列表。

序号 函数及说明
1 operator=

隐式声明的复制赋值运算符。

2 allocate

分配内存。

3 deallocate

释放内存。

4 construct

在已分配的存储空间中构造对象。

5 release

释放所有已分配的内存。

6 options

返回控制此资源池行为的选项。

7 upstream_resource

返回指向上游内存资源的指针。

8 new_object

分配并构造对象。

9 delete_object

销毁并释放对象。

10 resource

返回指向底层内存资源的指针。

自定义内存资源

在下面的示例中,我们将通过继承 std::pmr::memory_resource 来定义自定义内存资源。

#include <iostream>
#include <memory_resource>
class x: public std::pmr::memory_resource {
   protected: void * do_allocate(size_t size, size_t alignment) override {
      return::operator new(size);
   }
   void do_deallocate(void * p, size_t, size_t) override {
      ::operator delete(p);
   }
   bool do_is_equal(const memory_resource & other) const noexcept override {
      return this == & other;
   }
};
int main() {
   x myResource;
   int * a = static_cast < int * > (myResource.allocate(sizeof(int)));
   * a = 11;
   std::cout << "Result : " << * a << std::endl;
   myResource.deallocate(a, sizeof(int));
   return 0;
}

输出

以上代码的输出如下:

Result : 11

使用 synchronized_pool_resource

考虑以下示例,我们将使用 synchronized_pool_resource。

#include <iostream>
#include <memory_resource>
int main() {
   std::pmr::synchronized_pool_resource x;
   int * arr = static_cast < int * > (x.allocate(sizeof(int) * 4));
   for (int a = 0; a < 4; ++a) {
      arr[a] = a + 1;
      std::cout << arr[a] << " ";
   }
   std::cout << std::endl;
   x.deallocate(arr, sizeof(int) * 4);
   return 0;
}

输出

以下是以上代码的输出:

1 2 3 4
广告