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.]
Изменить: Ответ Джонатана Вакли должен быть гораздо более авторитетным и проницательным.