std:: dynarray vs std:: вектор


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

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

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

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

2 78

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