web-dev-qa-db-ja.com

gslライブラリのspanとarray_viewの違いは何ですか?

いくつかの最近の会議のプレゼンテーションで、Bjarne Stroustrupと他の人がC++とそれらをサポートするいくつかのタイプの新しいコーディングガイドラインについて言及しているのを聞いたことがあります。

具体的には、 関数のパラメーターとしてのspan<T>の代わりに(T* p, int n)の例 (32:00頃に話に);しかし、array_view<T>を使用する提案も覚えています。彼らは2つの選択肢ですが、同じ概念ですか?または、私は物事を混乱させていますが、実際にはそれほど関連していませんか?

私は、両者が何についてのものであるかの正式な定義を見つけることができないようです。

82
einpoklum

標準化委員会ライブラリワーキンググループ の人々と話しました。彼らはarray_viewが標準になって読み取り専用になろうとしていることを望んでいました。コアガイドラインには、読み取りと書き込みの抽象化が必要でした。 (潜在的な)標準とガイドラインサポートライブラリ(GSL)との衝突を避けるために、(読み取りおよび書き込み)array_viewspanに名前変更しました: https://github.com/Microsoft/gsl

168

CppCoreGuidlines で、元のarray_viewspanに名前が変更されました。

参照: https://github.com/isocpp/CppCoreGuidelines/pull/377

このように記述されています:

spanは、ポインターを使用して配列にアクセスする代わりに、境界チェックされた安全な代替手段です

42
Galik

文書 P0122R (2016-02-12)fromLibrary Evolution Working Group(LEWG)
正式にタイプarray_viewの名前をspanに変更します。

変更履歴

R0からの変更

  • コナ会議でLEWGからのフィードバックを受けて、提案されているタイプの名前をarray_viewからspanに変更しました。
  • [...]

また読むことができます:

標準への影響

この提案は純粋なライブラリ拡張です。標準のクラス、関数、またはヘッダーを変更する必要はありません。 byteタイプと P0257 で提案されているタイプエイリアシング動作の変更に依存する場合は、機能が強化されます。

ただし、採用された場合、この新しい型の標準ライブラリ関数をオーバーロードすると便利な場合があります(例はcopy())。

spanは標準C++(C++ 11)に実装されており、C++コードおよび商用オフィス生産性ソフトウェアの商用静的解析ツール内で正常に使用されています。オープンソースのリファレンス実装は、 https://github.com/Microsoft/GSL で入手できます。

次の章では、このドキュメントはread-onlyおよびread-writemutable)アクセス:

要素タイプと変換

spanは、テンプレートパラメータValueTypeを介して要素タイプで設定する必要があります。これは、抽象クラスタイプではない完全なオブジェクトタイプである必要があります。 spanは、カプセル化されたシーケンスへの読み取り専用アクセスまたは可変アクセスをサポートします。読み取り専用データにアクセスするには、ユーザーはspan<const T>を宣言でき、可変データへのアクセスにはspan<T>を使用します。

[...]


ガイドラインサポートライブラリレビュー:span<T> も参照してください。MariusBancila(2016年3月)のspanの定義:

ガイドラインサポートライブラリ は、- C++コアガイドライン で管理されている C++コアファウンデーション で管理されているいくつかのタイプと機能のMicrosoft実装です。 GSLが提供するタイプには、span<T>(以前はarray_view<T>と呼ばれていたもの)があります。

span<T>は、ポインター(およびサイズカウンター)または標準コンテナー(std::vectorまたはstd::arrayなど)の代わりに使用することが推奨される連続メモリの非所有範囲です。

11
olibre