跳到主要内容

std::allocator_traits<Alloc>::allocate

自 C++20 起
// 1)
[[nodiscard]] static constexpr pointer allocate( Alloc& a, size_type n );
// 2)
[[nodiscard]] static constexpr pointer allocate( Alloc& a, size_type n,
const_void_pointer hint );
从 C++11 起,直到 C++20
// 1)
static pointer allocate( Alloc& a, size_type n );
// 2)
static pointer allocate( Alloc& a, size_type n,
const_void_pointer hint );

使用分配器a分配n*sizeof(Alloc::value_type)字节的未初始化存储。在存储中创建了一个类型为Alloc::value_type[n]的数组,但没有构造它的任何元素。

  1. 调用a.allocate(n)
  2. 此外,还传递了内存局部性提示hint。如果可能,调用a.allocate(n, hint)。如果不可能(例如,a没有两个参数的成员函数allocate()),则调用a.allocate(n)

参数

a - 要使用的分配器
n - 要分配存储的对象数量
hint - 指向附近内存位置的指针

返回值

调用a.allocate(n)返回的指针

备注

直到P0593R6,Alloc::allocate才被要求创建数组对象,这使得使用非默认分配器为std::vector和其他一些容器,根据核心语言规范,实际上并未正确定义。

调用allocate并构造元素之前,在已分配的数组内,Alloc::value_type*的指针算术是定义良好的,但如果访问元素,行为是未定义的。

std::allocator_traits<Alloc>::allocate

自 C++20 起
// 1)
[[nodiscard]] static constexpr pointer allocate( Alloc& a, size_type n );
// 2)
[[nodiscard]] static constexpr pointer allocate( Alloc& a, size_type n,
const_void_pointer hint );
从 C++11 起,直到 C++20
// 1)
static pointer allocate( Alloc& a, size_type n );
// 2)
static pointer allocate( Alloc& a, size_type n,
const_void_pointer hint );

使用分配器a分配n*sizeof(Alloc::value_type)字节的未初始化存储。在存储中创建了一个类型为Alloc::value_type[n]的数组,但没有构造它的任何元素。

  1. 调用a.allocate(n)
  2. 此外,还传递了内存局部性提示hint。如果可能,调用a.allocate(n, hint)。如果不可能(例如,a没有两个参数的成员函数allocate()),则调用a.allocate(n)

参数

a - 要使用的分配器
n - 要分配存储的对象数量
hint - 指向附近内存位置的指针

返回值

调用a.allocate(n)返回的指针

备注

直到P0593R6,Alloc::allocate才被要求创建数组对象,这使得使用非默认分配器为std::vector和其他一些容器,根据核心语言规范,实际上并未正确定义。

调用allocate并构造元素之前,在已分配的数组内,Alloc::value_type*的指针算术是定义良好的,但如果访问元素,行为是未定义的。