c++ std::pmr::polymorphic_allocator的模板参数的用法是什么?

c8ib6hqw  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(173)

我目前正在学习多态分配器,我看了一些视频,并试图理解它。如果我有这样的代码:

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>有什么区别?为什么两者都能正常工作?

pod7payv

pod7payv1#

std::vector开始:
分配器-一个分配器,用于获取/释放内存,并构造/销毁内存中的元素。类型必须满足分配器的要求。行为未定义(C20之前)/如果Allocator::value_typeT不相同,则程序是病态的(C20起)。
因此,如果Allocator::value_typeMyClass不同:

  • 行为未定义(C++20之前)
  • 该程序是病态的(自C++20起)

因此正确的用法是使用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相同的内存资源。

相关问题