C++ 在内存资源中放置新操作符和pmr之间的区别?

C++ 在内存资源中放置新操作符和pmr之间的区别?,c++,c++17,new-operator,c++pmr,C++,C++17,New Operator,C++pmr,在C++17中,可以有如下代码: char buffer[64] = {}; std::pmr::monotonic_buffer_resource pool{std::data(buffer), std::size(buffer)}; std::pmr::vector<char> vec{ &pool }; char缓冲区[64]={}; std::pmr::单调缓冲区资源 池{std::data(buffer),std::size(buffer)}; st

在C++17中,可以有如下代码:

char buffer[64] = {}; 
std::pmr::monotonic_buffer_resource 
     pool{std::data(buffer), std::size(buffer)};
std::pmr::vector<char> vec{ &pool };
char缓冲区[64]={};
std::pmr::单调缓冲区资源
池{std::data(buffer),std::size(buffer)};
std::pmr::vector向量{&pool};
我们也有

char buf[64];
std::vector<char> *vect = new (buf) std::vector<char>;    // placement new
charbuf[64];
std::vector*vect=new(buf)std::vector;//新位置
这两个代码都使用堆栈中的一些空间。对我来说,新的位置似乎是多余的,而内存资源可以做得更多。这只是堆栈上的一个示例,但即使您希望在堆中拥有内存,pmr也将处理更多的条件

这是标准中的过度定义吗?如果我需要一个内存池,我应该使用哪一个?哪一个处理异常更好

我还没有找到关于内存资源的好教程,很多东西对我来说都是模棱两可的。此外,新职位也没什么用处

这是标准中的过度定义吗

不,这是比较高级工具和低级工具的必然结果。显然,高级工具将使用低级工具

如果没有新的位置(或类似于C++20的std::construct_at),就不可能在现有存储中创建对象。也就是说,
polymorphic_分配器
将在内部使用placement-
new
(或等效物)

还应该注意的是,
std::memory\u resource
仅仅是分配内存的方法。Placement—
new
是在可访问内存中创建对象的方式。他们做完全不同和不相关的事情。这就是为什么我说使用placement-
new
的是
多态分配器,而不是
内存资源或任何派生类


memory\u资源
s是纯内存分配器,而不是对象构造机制。容器分配器将对象构造与内存分配相结合。因此,就我所知,比较

操作系统对内存的新调用,而pmr之类的内存分配器会处理它们为您分配的内存。如果你管理你的记忆,我认为pmr是better@t.niese,我明白。从标准的角度来看,这似乎是不必要的view@justaguy,我同意你的看法。尽管如此,这使得语言变得模棱两可。@nicolas甚至第二个向量也在使用缓冲区内的存储。他们两个都在我很抱歉。你是对的。我不是有意要在那里买新的。我会更新它这是一个很好的答案。你能提供一些推荐信吗?@Aznaveh:什么推荐信?所有这些都是标准C++类型,如果您需要更多的信息,可以搜索。我想看看PMR的底层代码是否使用新的布局。如果您可以指向实现。