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



Проект 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 или VLAs или что-либо в C++11.
551   3  

3 ответов:

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.