В чем разница между span и array_view в библиотеке gsl?

94

В нескольких недавних презентациях на конференции я слышал, как Бьярн Страуструп и другие упоминали о новых правилах кодирования для C ++ и некоторых поддерживающих их типах.

В частности, я помню пример span<T>вместо вместо (T* p, int n)параметра функции (примерно в 32:00 до начала разговора); но я также помню предложение использовать array_view<T>. Это две альтернативы, но одна и та же концепция? Или я путаю вещи, и они на самом деле не так связаны?

Кажется, я не могу найти авторитетного определения того, чем они оба должны заниматься.

Эйнпоклум
источник
@DavidHaim: См. Редактирование, а также здесь, например.
einpoklum
В дикой природе существуют реализации и предложения представления массива. Вы смотрели на них?
Якк - Адам Неврамонт
1
Я считаю, что array_viewего переименовали в span.
Галик
@Galik: Можете ли вы предоставить доказательства? Если можете, напишите это как ответ, и я приму ...
einpoklum
@Yakk: Ну, да, немного, но я, кажется, вижу вещи, которые не обязательно связаны, например, часть Microsoft C ++ AMP и т. Д. Я подумал, что может быть несколько вещей с именем, array_viewплавающих вокруг.
einpoklum

Ответы:

190

Мы поговорили с людьми из рабочей группы библиотеки в комитете по стандартам . Они хотели array_view, чтобы этот стандарт был доступен только для чтения. Для основных рекомендаций нам нужна была абстракция, которая была доступна для чтения и записи. Чтобы избежать столкновения между (потенциальными) стандартами и библиотекой поддержки руководств (GSL), мы переименовали наш (чтение и запись) array_viewв span: https://github.com/microsoft/gsl .

Бьярне Страуструп
источник
41
А const array_view<T>плюс array view<const T>не удовлетворил?
einpoklum
Спасибо за приверженность мантре абстракции нулевой стоимости - я действительно думаю, что spanэто спасет многих программистов от совершения глупых ошибок. Я думаю, что можно было бы сообщить об этих новых изменениях более четким способом. Мне просто интересно - разве это не может быть решено так же ясно с помощью обычного итератора с произвольным доступом? Тип добавлен только для ясности?
Бенджамин Грюнбаум
6
Это был разговор о ресурсах и висячих указателях. промежуток и GSL были второстепенным вопросом. Взгляните на выступление Нила Макинтоша на CppCon 2015: «Развитие array_view и string_view для безопасного кода C ++» youtube.com/watch?v=C4Z3c4Sv52U и / или взгляните на исходный код GSL: github.com/microsoft/gsl . Мы также работает над формальной (стандартным) спецификацией.
Бьярн Страуструп
5
Было беспокойство, что «просмотр» подразумевает просто просмотр содержимого, а не его изменение, поэтому некоторые люди хотели другой суффикс для версии для чтения / записи. Я не думаю, что кто-то заботится о существовании типа array_view только для чтения. Это string_view, который по умолчанию должен быть доступен только для чтения.
Джеффри Яскин
Как кодировщик графики, где «вид» просто означает текущее представление данных для чтения / записи (например, glViewPort, D3D's SetViewport), сделать «просмотр» доступным только для чтения - это удивительно, но вне графики, я полагаю, я мог видеть, что «просмотр» больше как окно только для чтения, чем окно для чтения / записи.
Дуэйн Робинсон
45

В CppCoreGuidlines Оригинал array_viewбыл переименован в span.

См .: https://github.com/isocpp/CppCoreGuidelines/pull/377

Это описывается так:

span - это безопасная альтернатива использованию указателей для доступа к массивам с проверкой границ

Галик
источник
2
Я поставил вам +1, но ответ Бьярна Страуструпа (правда?) Более подробный.
einpoklum
30
@einpoklum Нет, я понял. Я бы, наверное, тоже предпочел Бьярна Страуструпа. Не (нюхать) принимать (нюхать) это (нюхать) личное (ваххххх) ...
Галик
1
Этот комментарий заставил меня почувствовать что-то внутри, так что +1 от меня тоже ;-)
YePhIcK
11

В документе P0122R (2016-02-12) Рабочей группы по эволюции библиотек (LEWG)
тип официально переименовывается array_viewвspan :

Журнал изменений

Отличия от R0

  • Изменено название предлагаемого типа с array_viewнаspan после отзыва от LEWG на встрече Kona.
  • [...]

Мы также можем прочитать:

Влияние на стандарт

Это предложение представляет собой чисто библиотечное расширение. Он не требует каких-либо изменений стандартных классов, функций или заголовков. Это было бы улучшено, если бы могло зависеть отbyte типа и изменений поведения псевдонимов типов, предложенных в P0257. .

Однако - в случае принятия - может быть полезно перегрузить некоторые стандартные библиотечные функции для этого нового типа (примером может быть copy()).

spanбыл реализован на стандартном C ++ (C ++ 11) и успешно используется в коммерческом инструменте статического анализа кода C ++, а также в коммерческом программном обеспечении для офисной работы. Эталонная реализация с открытым исходным кодом доступна по адресу https://github.com/Microsoft/GSL. .

В следующей главе эти документы представляют доступ только для чтения и чтения-записи ( изменяемый ):

Типы элементов и преобразования

spanдолжен быть настроен с использованием своего типа элемента с помощью параметра шаблона ValueType, который должен быть полным типом объекта, а не абстрактным типом класса. spanподдерживает доступ только для чтения или изменяемый доступ к инкапсулированной последовательности. Для доступа к данным только для чтения пользователь может объявить a span<const T>, а для доступа к изменяемым данным будет использоваться span<T>.

[...]


См. Также Обзор библиотеки поддержки рекомендаций:span<T> от Мариуса Бансила (март 2016 г.), определяющего spanкак:

Библиотека поддержки Руководство является реализация Microsoft некоторых типов и функций , описанных в Руководстве C ++ Ключевых поддерживается Фондом Standard C ++ . Среди типов, предоставляемых GSL, span<T>ранее известен как array_view<T>.

span<T>диапазон непрерывной памяти, не являющийся владельцем, рекомендуется использовать вместо указателей (и счетчика размера) или стандартных контейнеров (таких как std::vectorили std::array).

oHo
источник