std:: dynarray vs std:: вектор
C++14 представляет std::dynarray
:
std:: dynarray-это контейнер последовательности, который инкапсулирует массивы с помощью размер который фиксирован на конструкции и не изменяет повсеместно в время жизни объекта.
std::dynarray
должны быть выделены во время выполнения как же, как std::vector
.
Итак, каковы преимущества и использование std::dynarray
пока мы можем использовать std::vector
что является более динамичным (а также значительным)?
2 ответа:
Итак, каковы преимущества и использование
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
эта оптимизация требует сотрудничества с компилятором, она не может быть реализована как чистый тип библиотеки, и необходимая магия компилятора не была реализована, и никто не уверен, насколько это легко сделать. Из-за отсутствия опыта реализации, на заседании комитета C++ в Чикаго на прошлой неделе было решено вытащить
std::dynarray
из C++14 и выдать отдельный массив расширений TS (техническая спецификация) документ определениеstd::experimental::dynarray
и массивов во время выполнения связаны (бра, похожие на С99 Влас.) Это значитstd::dynarray
почти наверняка не будет в C++14.
как ты сам сказал,
std::dynarray
на фиксированного размера динамический массив. Он не может быть изменен. Это грубо говоря улучшение по сравнению сnew T[N]
иstd::unique_ptr<T[]>(new T[N])
.отсутствие необходимости изменять размер или управлять емкостью означает, что вы можете реализовать структуру данных с меньшей сложностью и в меньшем пространстве.
кроме того,
std::dynarray
это странное животное, которое позволяет реализовать его различными, неспецифическими способами, например, можно поставить массив в стеке. Вызов функции распределения является "необязательным". Вы можете указать распределитель для построения элементов массива, но это не является частью типа.вы также можете задаться вопросом, почему нам нужно
std::dynarray
и массивы переменной длины. VLAs в C++14 гораздо более ограничительны; они могут быть только локальными, автоматическими переменными и не предлагают способа указать политику распределения, и, конечно же, у них нет стандартного контейнера взаимодействие.
некоторые примеры из 23.3.4.2 "текущего проекта" (возьмите это, Google cache):
explicit dynarray(size_type c);
эффекты: выделяет память для
c
элементы. может или не может вызвать глобальногоoperator new
.template <class Alloc> dynarray(size_type c, const Alloc& alloc);
эффекты: эквивалентно предыдущим конструкторам, за исключением того, что каждый элемент построен с помощью uses-allocator строительство.
будь ты или нет можете использование данного распределителя для построения элементов массива является глобальной чертой:
шаблон struct uses_allocator, Alloc>: true_type { };
требуется:
Alloc
должен быть распределителем (17.6.3.5). [Примечание: специализация этого признака сообщает другим компонентам библиотеки, чтоdynarray
можно построить с распределителем, даже хотя он не имеет вложенного allocator_type.]Edit: ответ Джонатана Уэйкли должен быть гораздо более авторитетным и проницательным.