我目前正在学习多态分配器,我看了一些视频并试图理解它。如果我有这个代码:
class MyClass {
public:
MyClass(int val = 0) : m_val(val) {
std::cout << "MyClass constructed with value: " << val << std::endl;
}
~MyClass() {
std::cout << "MyClass destroyed with value: " << m_val << std::endl;
}
private:
int m_val;
};
int main() {
char buffer[1024];
std::size_t buffer_size = sizeof(buffer);
// Use a monotonic buffer resource
{
std::pmr::monotonic_buffer_resource buffer_resource{buffer, buffer_size, std::pmr::null_memory_resource()};
std::pmr::polymorphic_allocator<byte> allocator{ &buffer_resource };
//std::pmr::polymorphic_allocator<MyClass> allocator{ &buffer_resource }; //still OK to use
{
std::pmr::vector<MyClass> vec(allocator);
vec.reserve(256);
for(int i = 0; i < 256; i++){
vec.emplace_back(i);
}
}
}
return 0;
}
std::pmr::polymorphic_allocator<byte>
和 std::pmr::polymorphic_allocator<MyClass>
和有什么不一样?为什么两者都能正常工作?
std::vector
:
Allocator - 用于获取/释放内存以及构造/销毁该内存中的元素的分配器。类型必须满足Allocator的要求。行为未定义 (C++20 前)/程序非良构 (C++20 起) 若
与Allocator::value_type
不同。T
所以,如果
Allocator::value_type
与 MyClass
不同:
因此正确的使用方法是使用
std::pmr::polymorphic_allocator<MyClass>
.
为什么两者都能正常工作?
std::pmr::vector<MyClass>
构造函数 ...
constexpr explicit vector(
const std::pmr::polymorphic_allocator<MyClass>& alloc) noexcept;
...将您提供的分配器转换为
std::pmr::polymorphic_allocator<MyClass>
,它使用与您的allocator
相同的内存资源。