gpt4 book ai didi

c++ - 如何使用自定义分配器(没有 UB)提供的指向原始内存的指针?

转载 作者:行者123 更新时间:2023-12-01 13:42:34 31 4
gpt4 key购买 nike

我正在尝试编写一个分配器感知容器。假设我想为三个对象分配一 block 内存:

T* chunk = std::allocator_traits<Allocator>::allocate(allocator, 3);
(我知道分配器可以有自定义指针类型,因此我应该使用 std::allocator_traits<Allocator>::pointer ;为了简单起见,我在这里使用原始指针。)
现在我想在索引 2 处创建一个实际对象。我该怎么做?特别是,我如何计算指向尚不存在的元素的指针?最明显的选择如下:
std::allocator_traits<Allocator>::construct(allocator, chunk + 2, ...);
不幸的是, chunk + 2似乎不正确: according to the standard , 指针运算只能对指向数组元素的指针执行,否则会导致未定义的行为。出于同样的原因,我无法将指针转换为 std::byte*并使用指针算法。 (虽然 std::allocator 被定义为在新分配的内存中创建一个数组,但在 C++20 之前,自定义分配器不存在相同的要求。此外,虽然 C++20 为“隐式创建对象”添加了一些语言,这不适用于早期的 C++ 版本。)
那么如何计算指针作为 construct 的第二个参数?不会导致未定义的行为(在 C++20 之前)?

最佳答案

在最新的标准草案(C++20)中:

[tab:cpp17.allocator]

a.allocate(n) - Memory is allocated for an array of n T and such an object is created but array elements are not constructed.

allocator_traits::allocate(n)只需调用 a.allocate(n) .
因此,鉴于创建了数组,指针算术定义良好。

在接受提案 P0593R6 之前的 C++17 中,措辞是:

Memory is allocated for n objects of type T is created but objects are not constructed.


在此更改之前,没有明确定义的方式来执行您所要求的操作,除非:
  • 我们假设自定义分配器提供了创建此类数组的保证。这样做的问题是没有标准的方法来创建数组而不创建对象(没有默认分配器),因此没有标准的方法来实现这种自定义分配器。
  • 我们忽略了指针算术的限制。与此有关的理论问题是未定义的行为。在实践中,这对于实际的语言实现来说并不是问题。
  • 关于c++ - 如何使用自定义分配器(没有 UB)提供的指向原始内存的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63457241/

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