Яка різниця між span і array_view в бібліотеці gsl?


94

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

Зокрема, я пам’ятаю приклад, 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

Відповіді:


188

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


41
А const array_view<T>плюс array view<const T>не був задовільним?
einpoklum

Дякуємо за прихильність до мантри абстракцій з нульовою вартістю - я дійсно думаю, що spanце врятує багатьох програмістів від безглуздих помилок. Я думаю, що інформування про ці нові зміни може бути зроблено більш чітким способом. Мені просто цікаво - чи не можна це вирішити так чітко за допомогою звичайного ітератора довільного доступу? Тип був доданий лише для наочності?
Бенджамін Груенбаум,

6
Це була розмова про ресурси та звисаючі вказівки. span і GSL був побічною проблемою. Погляньте на виступ CppCon 2015 Ніла Макінтоша: «Розвиток array_view та string_view для безпечного коду C ++» youtube.com/watch?v=C4Z3c4Sv52U та / або подивіться на джерело GSL: github.com/microsoft/gsl . також працює над формальною специфікацією (стандартний стиль).
Б'ярн Страуструп,

5
Існувало занепокоєння, що "погляд" передбачав просто перегляд вмісту, а не його модифікацію, тому деякі люди хотіли мати інший суфікс для версії для читання / запису. Я не думаю, що хтось особливо дбає про існуючий тип array_view лише для читання. Це string_view, що люди за замовчуванням дбають лише про читання.
Джеффрі Яскін,

Як графічний кодер, де "view" означає лише поточний погляд на дані для читання / запису (наприклад, glViewPort, SetViewport D3D), створення "view" лише для читання дивує, але за межами графіки, я гадаю, я бачив, що "view" відчуває себе більше як вікно лише для читання, ніж вікно читання / запису.
Дуейн Робінсон

45

У CppCoreGuidlines оригінал array_viewперейменовано на span.

Див .: https://github.com/isocpp/CppCoreGuidelines/pull/377

Це описується таким чином:

span - це перевірена межами, безпечна альтернатива використанню покажчиків для доступу до масивів


2
Я поставив вам +1, але відповідь Bjarne Stroustrup (справді?) Є більш детальною.
einpoklum

30
@einpoklum Ні, я розумію. Я б, мабуть, обрав замість мене й Бьярна Страуструпа. Не (нюхати) брати (нюхати) це (нюхати) особисто (ваууууууууууууууууууууууууууу ...)
Галік

1
Цей коментар змусив мене щось відчути всередині, тому +1 від мене теж ;-)
YePhIcK

11

Документ P0122R (12.02.2016) від Робочої групи з розвитку бібліотек (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>, а для доступу до змінних даних використовуватиме a span<T>.

[...]


Див. Також Огляд бібліотеки підтримки:span<T> від Маріуса Банчіли (березень 2016 р.), Що визначає spanяк:

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

span<T>- це невласний діапазон суміжної пам'яті, який рекомендується використовувати замість покажчиків (та лічильника розміру) або стандартних контейнерів (таких як std::vectorабо std::array).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.