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
廣告