Подтвердить что ты не робот

Зачем нужны массивы размера времени выполнения и std:: dynarray в С++ 14?

Проект С++ 14 включает как массивы размера времени выполнения, так и контейнер std::dynarray. Из того, что я могу сказать, единственное реальное различие между ними состоит в том, что std::dynarray имеет интерфейс STL (например, begin, end, size и т.д.), В то время как массивы размера времени выполнения не работают. Так почему С++ 14 нуждается в них обоих?

Я понимаю, что массивы размера времени выполнения являются частью основного языка, а std::dynarray является частью стандартной библиотеки, но предложение для std::dynarray ясно, что авторы ожидают, что компиляторы во многих случаях будут предлагать специальную поддержку std::dynarray, чтобы она могла быть как можно более эффективной, то есть такой же эффективной, как и размер массива времени исполнения. Таким образом, различие языка/библиотеки кажется несколько искусственным.

Итак, опять же, почему С++ 14 нужны как массивы размера времени выполнения, так и std::dynarray? И учитывая, что std::dynarray имеет более богатый (STLified) интерфейс, почему бы просто не отбрасывать массивы размера времени выполнения, предполагая, что std::dynarray можно реализовать с равной эффективностью выполнения?

Разъяснение

Когда я говорю о "массивах размера времени исполнения", я имею в виду новую функцию языка С++ 14, описанную в N3639, а не на традиционные C-массивы или VLA или что-либо в С++ 11.

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Вы не можете просто сказать, что весь код, который использует новый [], теперь неправильный.

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

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

Ответ 3

Я думаю, что вы сами ответили на вопрос, std::dynarray имеет интерфейс stl. Цель С++ 11, и я предполагаю, что С++ 14 - сделать С++ более удобным для пользователя, менее подверженным ошибкам и более легким для новичков. С помощью массивов типов c вы можете столкнуться с арифметическими задачами указателя, но dynarray избегает проблем, если они используются как предназначенные EDIT: похоже, одно отличие состоит в том, что массивы размера времени выполнения должны быть выделены в стеке, увеличивая вероятность. dynarray выделяется в куче, хотя можно выделить в стеке (если реализация сделала это)