gpt4 book ai didi

c++ - 为什么在 c++17 中不推荐使用 std::allocator 的构造和销毁函数?

转载 作者:IT老高 更新时间:2023-10-28 14:01:24 25 4
gpt4 key购买 nike

c++17 规范弃用了 std::allocator 对象的 constructdestroy 成员。工作组提供了弃用其他成员函数的理由 here ,在“弃用 std::allocator 的冗余成员”标题下。

但是,他们没有具体提及为什么不推荐使用这两个成员,也没有具体提及替换该功能的建议。我假设这意味着使用 std::allocator_traits::construct 代替。

我对在某些情况下是否仍然需要实现 construct 感到有点困惑,尽管因为 this comment about std::allocator_traits::construct

Because this function provides the automatic fall back to placement new, the member function construct() is an optional Allocator requirement since C++11.

对于自定义分配器(例如,对于使用 memalign 的页面对齐内存),回退到放置 new 是否总是会产生正确的行为?

最佳答案

allocator requirements table表示如果提供 construct(c, args),则必须“在 c 处构造 C 类型的对象”。

它完全没有说明 1) 将哪些参数传递给 C 的构造函数或 2) 如何传递这些参数。这是分配器的选择,事实上标准中的两个分配器在将参数传递给 C 的构造函数之前确实会弄乱参数:std::scoped_allocator_adaptorstd::pmr::polymorphic_allocator .特别是在构造 std::pair 时,它们传递给 pair 的构造函数的参数甚至可能与它们收到的参数不同。

也不需要完美转发;如果效率低下,则 C++03 样式的 construct(T*, const T&) 符合要求。

std::allocatorconstructdestroy 已被弃用,因为它们无用:没有好的 C++11 及更高版本的代码不应该曾经直接调用它们,它们不会在默认值之上添加任何内容。


处理内存对齐应该是allocate的任务,而不是construct的任务。

关于c++ - 为什么在 c++17 中不推荐使用 std::allocator 的构造和销毁函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39414610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com