Std:: dynarray vs std::vector

С++ 14 представляет std::dynarray:

std:: dynarray - контейнер последовательности, который инкапсулирует массивы с помощью размер, который фиксируется при строительстве и не изменяется на протяжении всей время жизни объекта.

std::dynarray должен быть назначен во время выполнения так же, как std::vector.

Итак, каковы преимущества и использование std::dynarray, в то время как мы можем использовать std::vector, который является более динамичным (а также повторно значимым)?

Ответ 1

Итак, каковы преимущества и использование std::dynarray, когда мы можем использовать std::vector, который является более динамичным (Re-sizable)?

dynarray меньше и проще, чем vector, поскольку ему не нужно управлять отдельными значениями размера и емкости, и ему не нужно хранить распределитель.

Однако основное преимущество в производительности связано с тем, что реализациям рекомендуется выделять dynarray в стеке, когда это возможно, избегая распределения кучи. например.

std::dynarray<int> d(5);   // can use stack memory for elements
auto p = new std::dynarray<int>(6);  // must use heap memory for elements

Эта оптимизация требует сотрудничества с компилятором, она не может быть реализована как чистый тип библиотеки, и необходимая магия компилятора не была реализована, и никто не уверен, как легко это сделать. Из-за отсутствия опыта внедрения на собрании комитета С++ в Чикаго на прошлой неделе было решено вытащить std::dynarray из С++ 14 и выпустить отдельный документ TS расширений TS (техническая спецификация), определяющий std::experimental::dynarray, и массивы (ARB, аналогичные VLA C99). Это означает, что std::dynarray почти наверняка не будет в С++ 14.

Ответ 2

Как вы сами сказали, std::dynarray предназначен для динамического массива фиксированного размера. Он не изменяется. Это примерно соответствует улучшению по сравнению с new T[N] и над std::unique_ptr<T[]>(new T[N]).

Не нужно изменять размер или управлять мощностью, так как вы можете реализовать структуру данных с меньшей сложностью и в меньшем пространстве.

Кроме того, std::dynarray является странным животным, которое позволяет реализации реализовать его различными, неспецифическими способами, например. можно поместить массив в стек. Вызов функции распределения является "необязательным". Вы можете указать распределитель для построения элементов массива, но это не относится к типу.

Вы также можете задаться вопросом, зачем нам нужны std::dynarray и массивы переменной длины. VLA в С++ 14 гораздо более ограничительны; они могут быть только локальными, автоматическими переменными и не дают возможности указать политику распределения, и, конечно, у них нет стандартного интерфейса контейнера.


Некоторые примеры из 23.3.4.2 "текущего проекта" (возьмите это, кэш Google):

explicit dynarray(size_type c);

Эффекты: выделяет память для элементов c. Может или не может вызывать глобальный operator new.

template <class Alloc>
dynarray(size_type c, const Alloc& alloc);

Эффекты: эквивалентны предыдущим конструкторам, за исключением того, что каждый элемент сконструирован с использованием конструкции-распределителя.

Можно ли использовать данный распределитель для создания элементов массива, является глобальным признаком:

шаблон    struct uses_allocator, Alloc > : true_type {};

Требуется: Alloc должен быть Алокатором (17.6.3.5). [Примечание. Специализация этого признака сообщает другим библиотечным компонентам, что dynarray может быть сконструирован с помощью распределителя, даже если он не имеет вложенного allocator_type.]

Изменить: Ответ Джонатана Вакли должен быть гораздо более авторитетным и проницательным.