Проект C ++ 14 включает в себя как размерные массивы, так и std::dynarray
контейнер. Из того, что я могу сказать, единственная реальная разница между ними состоит в том, что std::dynarray
имеет интерфейс STL (например, begin
, end
, size
и т. д.), в то время как во время выполнения массивов нет. Так почему же C ++ 14 нуждается в них обоих?
Я понимаю, что размерные массивы являются частью основного языка, в то время как std::dynarray
является частью стандартной библиотеки, но предложение для std::dynarray
ясно дает понять, что авторы ожидают, что компиляторы во многих случаях предложат специальную поддержку для std::dynarray
так что он может быть настолько эффективным, насколько это возможно, т. е. таким же эффективным, как массив размера во время выполнения. Таким образом, различие между языком и библиотекой кажется несколько искусственным.
Итак, еще раз, почему C ++ 14 нужны как массивы времени выполнения и std::dynarray
? И учитывая, что std::dynarray
имеет более богатый (STLified) интерфейс, почему бы просто не удалить массивы во время выполнения, если предположить, что std::dynarray
может быть реализован с равной эффективностью выполнения?
осветление
Когда я говорю о «массивах размера во время выполнения», я имею в виду новую особенность языка C ++ 14, которая описана в N3639, не для традиционных массивов C или VLA или чего-либо в C ++ 11.
N3639 предлагает добавить в C ++ локальные массивы времени выполнения с автоматической продолжительностью хранения.
N2648 говорит, что в соответствии с практикой C ++, std::dynarray
s можно использовать не только с автоматическими переменными. Но чтобы воспользоваться преимуществами распределения стека эффективности, мы хотим сделать dynarray
оптимизируется при использовании в качестве автоматической переменной.
Короче говоря, массивы во время выполнения в стиле C11 ограничены хранением в стеке. dynarray
нет, но его можно оптимизировать при хранении в стеке, чтобы он был таким же эффективным, как массивы размера во время выполнения в стиле C11 (или это цель).
Массивы размера во время выполнения в стиле C11 все еще могут быть полезным синтаксисом, и затраты на повышение совместимости с C невелики: механизм должен быть реализован для эффективной автоматической dynarray
во всяком случае. Кроме того, массивы во время выполнения в стиле C11 являются гражданами первого класса и существуют независимо от использования std
библиотеки программистом.
Существуют важные различия между фактическими массивами размера среды выполнения C11 и массивами размера среды выполнения C11 1y в стиле C11, немаловажным из которых является среда выполнения sizeof
поддержка фактических массивов C11. Но основное использование этого может быть совместимым.
Обратите внимание, что в конце концов, ни где добавлено в C ++ 14.
Я думаю, ты сам ответил на вопрос, std::dynarray
имеет интерфейс stl. Цель c ++ 11, и я предполагаю, что c ++ 14 — сделать c ++ более удобным для пользователя, менее подверженным ошибкам и более простым для начинающих. С массивами в стиле c вы можете столкнуться с проблемами арифметики указателей, но dynarray
избегает проблем, если используется по назначению
РЕДАКТИРОВАТЬ: таким образом, похоже, одно отличие состоит в том, что массивы размера во время выполнения должны быть размещены в стеке, увеличивая вероятность переполнения стека. dynarray
размещается в куче, хотя возможно разместить в стеке (если реализация сделала это)
Как ты сам сказал std::dynarray
обеспечит интерфейс в стиле STL, что делает его более идиоматичным в использовании. Тем не менее, C ++ нужны динамические массивы, созданные с new[]
чтобы:
std::dynarray
(так что вы не можете иметь Dynarray без нового [])Нельзя просто сказать, что весь код, который использует new [], теперь неверен.
В общем, разница между C ++ 14 std::dynarray
и C ++ new[]
массив почти такой же, как разница между C ++ 11 std::array
и массивы в стиле C
UPD: Теперь я вижу, что вы сейчас спрашиваете о функции, аналогичной C11 (VLA). На самом деле это не имеет ничего общего — VLA очень ограничены, и вы можете использовать только аргумент функции в качестве размера вашего массива. Кроме того, память выделяется в стеке, но для std::dynarray
память выделяется в куче. По сути, эта функция просто расширяет массивы в стиле C и делает C ++ более совместимым с современным стандартом C.