如何准确地与分配器模拟新的T [N]?(How to exactly simulate new T[

2019-09-20 03:05发布

表达new T[n] 可以或不可以在阵列中初始化每个对象,这取决于T是。

如何复制使用此初始化行为allocator

struct Foo
{
    int x;
    Foo() : x(1)
        { }
};

Foo *p = new Foo[1];
assert(p[0].x == 1);

Answer 1:

在C ++ 03,分配器接口只知道初始化对象的一种方式,这也是从另一个对象复制。 C ++ 11具有更多。

你问的默认初始化,这意味着(约),“要么什么都不做或调用默认的构造函数”。 分配器接口不能做在C ++ 03的后者。

我想你可以写的东西,如:

T *ra = allocator.allocate(1);
if (!is_pod<T>::value) {
    // in C++03
    allocator.construct(ra, T());
    // in C++11
    allocator.construct(ra);
}

is_pod测试可能是错的,但。 检查标准到底是什么条件下使用默认初始化什么都不做。 显然is_pod并不在C ++ 03的存在,但我依稀记得,加速了,在大多数的实施工作的那种东西。

我认为,你在这里战斗的设计。 分配器接口被设计为通过容器中使用。 容器设计不包含未初始化的元素,所以他们没有使用默认初始化。



文章来源: How to exactly simulate new T[n] with an allocator?