高效内存管理:探索C++17中的pmr模块
1.引入
2.memory_resource
3.内存复用
4.pool resource
1.引入
在C++17之前,标准库提供了std::allocator,而在C++17中,这一功能得到了加强,引入了polymorphic_allocator。
注:本节所有的源码戳文末~
在C++17之前,如果我们想要使用std::allocator来自定义内存池,我们不能使用传统的虚拟多态方式,因为std::allocator并没有提供虚拟函数。因此,通过继承显然不是一个好的选择,但是我们可以将其作为类成员使用,如下所示:
template <typename Allocator = std::allocator<uint8_t>>
class MemoryPool {
public:
explicit STLMemoryPool(const Allocator& alloc) : alloc_(alloc) {}
Status Allocate(int64_t size, uint8_t** out) {
try {
*out = alloc_.allocate(size);
} catch (std::bad_alloc& e) {
return Status::OutOfMemory(e.what());
}
return Status::OK();
}
void Free(uint8_t* buffer, int64_t size) {
alloc_.deallocate(buffer, size);
}
private:
Allocator alloc_;
};
在C++17之前如果我们想在内存分配/释放时做一些print操作,或者一些自定义操作,可以使用两种办法:
自定义全局的new/delete
void* operator new(std::size_t size) {
void* ptr = malloc(size);
std::cout << "Allocated: " << size << " bytes at address " << ptr << std::endl;
return ptr;
}
void operator delete(void* ptr, std::size_t n) noexcept {
std::cout << "Deallocated: " << n << " bytes at address " << ptr << std::endl;
free(ptr);
}
自定义allocator
class allocator {
public:
using value_type = T;
value_type* allocate(std::size_t n) {
value_type* p = static_cast<value_type*>(::operator new(n * sizeof(value_type)));
std::cout << "Allocated: " << n * sizeof(value_type) << " bytes at address "
&nb

本文介绍了C++17引入的polymorphicmemoryresources(pmr)模块,包括如何使用自定义内存管理、C++17之前的内存操作方式,以及monotonic_buffer_resource和synchronized_pool_resource等内存复用和线程安全池的使用。作者详细展示了如何通过继承和重写memory_resource接口实现自定义内存操作和内存复用策略。
最低0.47元/天 解锁文章
35

被折叠的 条评论
为什么被折叠?



