Цикл allocator.construct равен std :: uninitialized_copy? - PullRequest
7 голосов
/ 18 мая 2011

В этом контексте T - это определенный тип, а allocator - это объект-распределитель для этого типа.По умолчанию это std::allocator<T>, но это не обязательно так.

У меня есть фрагмент памяти, полученный allocator.allocate(n).У меня также есть контейнер con из T объектов (скажем, std::vector<T>).Я хочу инициализировать этот фрагмент памяти с помощью объекта T.

Расположение фрагмента памяти хранится в T* data.

Всегда ли эти два примера кодаидентичны?

#include <memory>

// example 1
std::uninitialized_copy(con.begin(), con.end(), data)

// example 2
std::vector<T>::const_iterator in = con.begin();
for (T* out = data; in != con.end(); ++out, ++in) {
    allocator.construct(out, *in);
}

А для этих двоих?

#include <memory>

T val = T(); // could be any T value

// example 3
std::uninitialized_fill(data, data + n, val)

// example 4
for (T* out = data; out != (data + n); ++out) {
    allocator.construct(out, val);
}

1 Ответ

6 голосов
/ 18 мая 2011

Согласно этим объяснениям Они должны делать то же самое, поскольку, как говорят, allocator::construct создает объект, а std::uninitialized... также создает объекты.Но я не знаю, что именно говорит стандарт и какая у вас свобода, когда вы реализуете свои собственные allocator::construct.

РЕДАКТИРОВАТЬ: Хорошо, в стандарте C ++ 03 говорится в разделе20.1.5 §2 таблицы 32, что construct(p,t) должен иметь тот же эффект, что и new ((void*)p) T(t) (для любого стандартного совместимого распределителя, а не только std::allocator).А в 20.4.4.1 §1 этот uninitialized_copy должен иметь тот же эффект, что и

for (; first != last; ++result, ++first)
    new (static_cast<void*>(&*result))
            typename iterator_traits<ForwardIterator>::value_type(*first);

, а в 20.4.4.2 §1 этот uninitialized_fill имеет эффект

for (; first != last; ++first)
    new (static_cast<void*>(&*first))
            typename iterator_traits<ForwardIterator>::value_type(x);

Так что я думаю, это не оставляет им места для поведения по-другому.Итак, чтобы ответить на ваш вопрос: да, это так.

...