C ++ 14 представляет std::dynarray
:
std :: dynarray - это контейнер последовательности, который инкапсулирует массивы с размером, который фиксируется при построении и не изменяется на протяжении всего времени существования объекта.
std::dynarray
должен быть выделен во время выполнения так же, как std::vector
.
Итак, каковы преимущества и возможности использования, в std::dynarray
то время как мы можем использовать std::vector
более динамичный (а также масштабируемый)?
std::valarray
переименованstd::dynarray
? Что динамично,std::dynarray
когда его нельзя изменить размер?valarray
. Он динамический, потому что длина массива является значением времени выполнения, его не нужно знать во время компиляции, в отличие отstd::array
dynarray
был удален из C ++ 14 и помещен в будущую техническую спецификацию (подумайте об этом как о новой версии TR1), потому что он имеет некоторые серьезные технические проблемы.Ответы:
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
массивов, определяющий и массивы ограничений времени выполнения (ARB, аналогичные в C99 VLA.) Это означает,std::dynarray
что почти наверняка не будет в C ++ 14.источник
dynarray
в дикой природе. Я всегда думал, что вам нужны две независимые реализации существующей практики, прежде чем что-то станет подходящим для стандартизации.dynarray
. Хотя опыт внедрения очень полезен, нет установленного правила, требующего его (но некоторые говорят, что оно должно быть!)Как вы сами сказали,
std::dynarray
это для динамического массива фиксированного размера . Его размер нельзя изменить. Грубо говоря, это улучшение сноваnew T[N]
и сноваstd::unique_ptr<T[]>(new T[N])
.Отсутствие необходимости изменять размер или управлять емкостью означает, что вы можете реализовать структуру данных с меньшей сложностью и на меньшем пространстве.
Более того,
std::dynarray
это странное животное, которое позволяет реализации реализовать его разными, неспецифическими способами, например, можно поместить массив в стек. Вызов функции распределения «необязателен». Вы можете указать распределитель для создания элементов массива, но он не является частью типа.Вы также можете задаться вопросом, зачем нам
std::dynarray
и массивы переменной длины. VLA в C ++ 14 гораздо более строгие; они могут быть только локальными автоматическими переменными и не предлагают возможности указать политику распределения, и, конечно же, у них нет стандартного интерфейса контейнера.Некоторые примеры из 23.3.4.2 "текущего черновика" (возьмите это, кеш Google):
Независимо от того или нет , вы можете использовать данный аллокатор для построения элементов массива является глобальной чертой:
Изменить: ответ Джонатана Уэйкли должен быть гораздо более авторитетным и проницательным.
источник
dynarray
конструктор никогда не используется для распределения, она используется только в качестве аргумента для конструкторов элементов (с использованием «конструкции использует-распределитель»). Вот почему вы не можете запросить, использовался ли распределитель: потому что его никогда не было.