home | help
std::pmr::s...lt_resource(3)   C++ Standard Libary  std::pmr::s...lt_resource(3)

NAME
     std::pmr::set_default_resource - std::pmr::set_default_resource

Synopsis
	Defined in header <memory_resource>
	std::pmr::memory_resource*			   set_default_resource(
     (since C++17)
	std::pmr::memory_resource* r ) noexcept;

	If r is not null, sets the default memory resource pointer to r;  other-
     wise, sets the
	default memory resource pointer to std::pmr::new_delete_resource().

	The  default  memory resource pointer is used by certain facilities when
     an explicit
	memory resource is not supplied. The  initial  default	memory	resource
     pointer is the
	return value of std::pmr::new_delete_resource.

	This  function	is  thread-safe. Every call to std::pmr::set_default_re-
     source
	synchronizes with (see std::memory_order) the subsequent
	std::pmr::set_default_resource and std::pmr::get_default_resource calls.

Return value
	Returns the previous value of the default memory resource pointer.

Example
     // Run this code

      #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,  align-
     ment);
	      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  noex-
     cept 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";
	  }
      }

Possible output:
      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

See also
	get_default_resource gets the default std::pmr::memory_resource
	(C++17) 	     (function)
			     returns a static program-wide  std::pmr::memory_re-
     source that
	new_delete_resource  uses the global operator new and operator delete to
     allocate
	(C++17) 	     and deallocate memory
			     (function)

http://cppreference.com 	   2024.06.10	    std::pmr::s...lt_resource(3)

home | help