名稱空間
變體
操作

std::pmr::set_default_resource

來自 cppreference.com
< cpp‎ | 記憶體
 
 
記憶體管理庫
(僅作說明*)
未初始化記憶體演算法
(C++17)
(C++17)
(C++17)
受約束的未初始化
記憶體演算法
C 庫

分配器
記憶體資源
pmr::set_default_resource
(C++17)
垃圾回收支援
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化儲存
(直到 C++20*)
(直到 C++20*)
顯式生命週期管理
 
定義於標頭檔案 <memory_resource>
std::pmr::memory_resource* set_default_resource( std::pmr::memory_resource* r ) noexcept;
(C++17 起)

如果 r 不為空,則將預設記憶體資源指標設定為 r;否則,將預設記憶體資源指標設定為 std::pmr::new_delete_resource()

在未提供顯式記憶體資源時,某些工具會使用**預設記憶體資源指標**。最初的預設記憶體資源指標是 std::pmr::new_delete_resource 的返回值。

此函式是執行緒安全的。每次呼叫 std::pmr::set_default_resource 都與後續的 std::pmr::set_default_resourcestd::pmr::get_default_resource 呼叫**同步**(參見 std::memory_order)。

[編輯] 返回值

返回預設記憶體資源指標的先前值。

[編輯] 示例

#include <array>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <iterator>
#include <memory_resource>
#include <vector>
 
class noisy_allocator : public std::pmr::memory_resource
{
    void* do_allocate(std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "+ Allocating " << bytes << " bytes @ ";
        void* p = std::pmr::new_delete_resource()->allocate(bytes, alignment);
        std::cout << p << '\n';
        return p;
    }
 
    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "- Deallocating " << bytes << " bytes @ " << p << '\n';
        return std::pmr::new_delete_resource()->deallocate(p, bytes, alignment);
    }
 
    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override
    {
        return std::pmr::new_delete_resource()->is_equal(other);
    }
};
 
int main()
{
    constexpr int push_back_limit{16};
    noisy_allocator mem;
    std::pmr::set_default_resource(&mem);
 
    {
        std::cout << "Entering scope #1 (without buffer on stack)...\n";
        std::cout << "Creating vector v...\n";
        std::pmr::vector<std::uint16_t> v{1, 2, 3, 4};
        std::cout << "v.data() @ " << v.data() << '\n';
 
        std::cout << "Requesting more...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Exiting scope #1...\n";
    }
 
    std::cout << '\n';
 
    {
        std::cout << "Entering scope #2 (with buffer on stack)...\n";
 
        std::uint8_t buffer[16];
        std::cout << "Allocating buffer on stack: " << sizeof buffer << " bytes @ "
                  << static_cast<void*>(buffer) << '\n';
        std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};
 
        std::cout << "Creating vector v...\n";
        std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
        std::cout << "v.data() @ " << v.data() << '\n'; // equals to `buffer` address
 
        std::cout << "Requesting more...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Exiting scope #2...\n";
    }
}

可能的輸出

Entering scope #1 (without buffer on stack)...
Creating vector v...
+ Allocating 8 bytes @ 0x1f75c30
v.data() @ 0x1f75c30
Requesting more...
+ Allocating 16 bytes @ 0x1f75c50
- Deallocating 8 bytes @ 0x1f75c30
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
+ Allocating 32 bytes @ 0x1f75c70
- Deallocating 16 bytes @ 0x1f75c50
v.size(): 9
v.size(): 10
v.size(): 11
v.size(): 12
v.size(): 13
v.size(): 14
v.size(): 15
v.size(): 16
+ Allocating 64 bytes @ 0x1f75ca0
- Deallocating 32 bytes @ 0x1f75c70
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Exiting scope #1...
- Deallocating 64 bytes @ 0x1f75ca0
 
Entering scope #2 (with buffer on stack)...
Allocating buffer on stack: 16 bytes @ 0x7fffbe9f8240
Creating vector v...
v.data() @ 0x7fffbe9f8240
Requesting more...
+ Allocating 64 bytes @ 0x1f75ca0
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
v.size(): 9
v.size(): 10
v.size(): 11
v.size(): 12
v.size(): 13
v.size(): 14
v.size(): 15
v.size(): 16
+ Allocating 128 bytes @ 0x1f75cf0
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Exiting scope #2...
- Deallocating 128 bytes @ 0x1f75cf0
- Deallocating 64 bytes @ 0x1f75ca0

[編輯] 參見

獲取預設的 std::pmr::memory_resource
(函式) [編輯]
返回一個程式範圍的靜態 std::pmr::memory_resource,它使用全域性的 operator newoperator delete 來分配和釋放記憶體
(函式) [編輯]