Почему в C ++ 14 используются как массивы времени выполнения, так и std :: dynarray?

Проект 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.

44

Решение

N3639 предлагает добавить в C ++ локальные массивы времени выполнения с автоматической продолжительностью хранения.

N2648 говорит, что в соответствии с практикой C ++, std::dynarrays можно использовать не только с автоматическими переменными. Но чтобы воспользоваться преимуществами распределения стека эффективности, мы хотим сделать dynarray оптимизируется при использовании в качестве автоматической переменной.

Короче говоря, массивы во время выполнения в стиле C11 ограничены хранением в стеке. dynarray нет, но его можно оптимизировать при хранении в стеке, чтобы он был таким же эффективным, как массивы размера во время выполнения в стиле C11 (или это цель).

Массивы размера во время выполнения в стиле C11 все еще могут быть полезным синтаксисом, и затраты на повышение совместимости с C невелики: механизм должен быть реализован для эффективной автоматической dynarray во всяком случае. Кроме того, массивы во время выполнения в стиле C11 являются гражданами первого класса и существуют независимо от использования std библиотеки программистом.

Существуют важные различия между фактическими массивами размера среды выполнения C11 и массивами размера среды выполнения C11 1y в стиле C11, немаловажным из которых является среда выполнения sizeof поддержка фактических массивов C11. Но основное использование этого может быть совместимым.

Обратите внимание, что в конце концов, ни где добавлено в C ++ 14.

31

Другие решения

Я думаю, ты сам ответил на вопрос, std::dynarray имеет интерфейс stl. Цель c ++ 11, и я предполагаю, что c ++ 14 — сделать c ++ более удобным для пользователя, менее подверженным ошибкам и более простым для начинающих. С массивами в стиле c вы можете столкнуться с проблемами арифметики указателей, но dynarray избегает проблем, если используется по назначению
РЕДАКТИРОВАТЬ: таким образом, похоже, одно отличие состоит в том, что массивы размера во время выполнения должны быть размещены в стеке, увеличивая вероятность переполнения стека. dynarray размещается в куче, хотя возможно разместить в стеке (если реализация сделала это)

2

Как ты сам сказал std::dynarray обеспечит интерфейс в стиле STL, что делает его более идиоматичным в использовании. Тем не менее, C ++ нужны динамические массивы, созданные с new[] чтобы:

  1. по крайней мере, реализовать std::dynarray (так что вы не можете иметь Dynarray без нового [])
  2. сохранить совместимость с предыдущими версиями

Нельзя просто сказать, что весь код, который использует new [], теперь неверен.

В общем, разница между C ++ 14 std::dynarray и C ++ new[] массив почти такой же, как разница между C ++ 11 std::array и массивы в стиле C

UPD: Теперь я вижу, что вы сейчас спрашиваете о функции, аналогичной C11 (VLA). На самом деле это не имеет ничего общего — VLA очень ограничены, и вы можете использовать только аргумент функции в качестве размера вашего массива. Кроме того, память выделяется в стеке, но для std::dynarray память выделяется в куче. По сути, эта функция просто расширяет массивы в стиле C и делает C ++ более совместимым с современным стандартом C.

2
По вопросам рекламы [email protected]