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



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



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



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

587   3  

3 ответов:

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

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

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

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

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

документ P0122R (2016-02-12) от Рабочая Группа По Эволюции Библиотек (LEWG)
официально переименовывает типа array_view до span:

изменений

изменения от R0

  • изменено имя предлагаемого типа с array_view до span после обратной связи от ЛЬЮГА на собрании Кона.
  • [...]

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

воздействие на уровень

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

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

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

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

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

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

[...]


см. также Обзор Библиотеки Поддержки Руководящих Принципов:span<T> от Marius Bancila (март 2016) определение span как:

The Библиотека Поддержки Руководящих Принципов внедрение Microsoft некоторых типов и функций, описанных в Основные Принципы C++ поддерживается стандартный C++ Foundation. Среди типов, предоставляемых GSL является span<T> ранее известный как array_view<T>.

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

Comments

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