std::uninitialized_move 具有特定的分配器
std::uninitialized_move with specific allocator
我正在编写一个自定义容器模板 class,stl 中的许多(如果不是全部)容器都可以使用指定的分配器类型。
为了实现范围插入功能,我需要将容器中的一些元素向前移动一些空间,其中内存仍未初始化。为此,我想使用一些(不存在的)std::uninitialized_move()
版本,它使用容器中的分配器。
另一种选择是在 for 循环中使用分配器移动构造对象,并在出现异常时销毁构造的对象。这基本上是用额外的功能重新实现 std::uninitialized_move()
。
我的编译器 (GCC) 的标准库实现完全具有我需要的功能(std::__uninitialized_move_a()
、std::__uninitialized_copy_a()
等),并且实际上用于 std 容器的实现,但是我认为这些是特定于编译器的。
我应该使用这个功能吗(可移植性)?或者还有其他更实用的选择吗?
也许标准库中有我遗漏的东西。
Should I use this functions (portability)?
您不应该使用 GCC 内部函数。
不,似乎没有标准的等效项。您可以编写这些函数的自己的版本。如果这样做,请注意 CustomAlloc::construct
是一个可选函数(例如,std::allocator
自 C++20 起就没有此函数),因此应该通过 std::allocator_traits<CustomAlloc>::construct
使用它。自 C++20 以来,这具有作为 constexpr 的额外好处。
Or is there other, more practical, option?
一种选择是忽略 CustomAlloc::construct
已被实施以执行除直接放置 new 之外的其他操作的可能性,从而简单地使用标准 std::uninitialized_move
.
这在技术上限制了容器在理论上支持的分配器,但另一方面,我从未见过在实践中使用过这种自定义分配器。如果容器至少供内部使用,这可能是合理的限制。如果您这样做,请仔细记录该行为。
我正在编写一个自定义容器模板 class,stl 中的许多(如果不是全部)容器都可以使用指定的分配器类型。
为了实现范围插入功能,我需要将容器中的一些元素向前移动一些空间,其中内存仍未初始化。为此,我想使用一些(不存在的)std::uninitialized_move()
版本,它使用容器中的分配器。
另一种选择是在 for 循环中使用分配器移动构造对象,并在出现异常时销毁构造的对象。这基本上是用额外的功能重新实现 std::uninitialized_move()
。
我的编译器 (GCC) 的标准库实现完全具有我需要的功能(std::__uninitialized_move_a()
、std::__uninitialized_copy_a()
等),并且实际上用于 std 容器的实现,但是我认为这些是特定于编译器的。
我应该使用这个功能吗(可移植性)?或者还有其他更实用的选择吗? 也许标准库中有我遗漏的东西。
Should I use this functions (portability)?
您不应该使用 GCC 内部函数。
不,似乎没有标准的等效项。您可以编写这些函数的自己的版本。如果这样做,请注意 CustomAlloc::construct
是一个可选函数(例如,std::allocator
自 C++20 起就没有此函数),因此应该通过 std::allocator_traits<CustomAlloc>::construct
使用它。自 C++20 以来,这具有作为 constexpr 的额外好处。
Or is there other, more practical, option?
一种选择是忽略 CustomAlloc::construct
已被实施以执行除直接放置 new 之外的其他操作的可能性,从而简单地使用标准 std::uninitialized_move
.
这在技术上限制了容器在理论上支持的分配器,但另一方面,我从未见过在实践中使用过这种自定义分配器。如果容器至少供内部使用,这可能是合理的限制。如果您这样做,请仔细记录该行为。