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


94

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

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

私は彼らの両方がどうあるべきかについての信頼できる定義を見つけることができないようです。


@DavidHaim:たとえば、ここと同様に編集を参照してください。
einpoklum

配列ビューの実装と提案が実際に行われています。それらを見たことがありますか?
Yakk-Adam Nevraumont 2016年

1
array_view改名されたと思いますspan
Galik、2016年

@Galik:証拠を提供できますか?できれば、それを回答として書いて受け入れます...
einpoklum

@Yakk:ええ、はい、少しですが、Microsoft C ++ AMPの一部など、必ずしも関連していないものを見かけているようですarray_view
einpoklum 2016年

回答:


188

私たちは、人々と話図書館ワーキンググループ標準化委員会。彼らはarray_view彼らが標準に入るように試みていることを読み取り専用に望んでいました。コアガイドラインには、読み書き可能な抽象化が必要でした。(潜在的な)基準やガイドラインのサポートライブラリ(GSL)との衝突を避けるために、我々は、(読み書き)私たちの名前を変更array_viewするspanhttps://github.com/microsoft/gsl


41
そしてconst array_view<T>プラスarray view<const T>は満足できませんでしたか?
einpoklum 2016年

ゼロコストの抽象化のマントラに取り組んでいただきありがとうございspanます。多くのプログラマーが愚かなエラーをするのを防ぐことができると思います。これらの新しい変更を伝えることは、より明確な方法で行うことができると思います。私はただ不思議に思っています-これは通常のランダムアクセスイテレータで明確に解決できるものではないでしょうか?タイプは明確にするために追加されましたか?
Benjamin Gruenbaum 2016年

6
これは、リソースとぶら下がりポインタについての話でした。スパンとGSLは副次的な問題でした。Neil MacIntoshのCppCon 2015の講演「安全なC ++コードのためのarray_viewとstring_viewの進化」youtube.com/watch?v=C4Z3c4Sv52Uをご覧になるか、GSLソース:github.com/microsoft/gslをご覧ください。正式な(標準スタイル)仕様にも取り組んでいます
Bjarne Stroustrup

5
「表示」は内容を変更するのではなく、単に見るだけであるという懸念があったため、一部の人々は、読み取り/書き込みバージョンに別のサフィックスを必要としていました。読み取り専用のarray_viewタイプが存在することを誰も気にしないと思います。デフォルトでは、人々は読み取り専用である必要があるのはstring_viewです。
Jeffrey Yasskin、2016年

「ビュー」が単に読み取り/書き込みデータへの現在のビューを意味するグラフィックスコーダー(たとえば、glViewPort、D3DのSetViewport)として、「ビュー」を読み取り専用にすることは驚くべきことですが、グラフィックス以外では、「ビュー」の感覚がもっと見えると思います。読み取り/書き込みウィンドウよりも読み取り専用ウィンドウのようなものです。
ドウェインロビンソン

45

CppCoreGuidlines元はarray_viewに名前が変更されましたspan

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

このように説明されています:

spanは、境界をチェックして、ポインタを使用して配列にアクセスする代わりの安全な方法です。


2
私はあなたに+1しましたが、Bjarne Stroustrup(本当に?)の答えはより詳細です。
einpoklum

30
@einpoklumいいえ、わかりました。私もおそらくBjarne Stroustrupを選んだでしょう。(スニフ)それを取らない(スニフ)それは(スニフ)個人的な(ワッッッ)...
Galik

1
そのコメントは私に何かを感じさせたので、私からも+1しました;-)
YePhIcK

11

Library Evolution Working Group(LEWG)のドキュメントP0122R(2016-02-12)は、タイプの名前を正式に変更ます。
array_viewspan

変更ログ

R0からの変更点

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

以下も読むことができます:

標準への影響

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

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

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

次の章では、このドキュメントは読み取り専用および読み取り/書き込み変更可能)アクセスについて説明します。

要素タイプと変換

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

[...]


参照してください:ガイドラインサポートライブラリレビューspan<T>マリウスBancila(2016年3月)の定義からspan通りを:

ガイドラインサポートライブラリはで説明したタイプと機能のいくつかのマイクロソフトの実装であるC ++コアガイドライン によって維持、標準C ++財団。GSLが提供するタイプの中には、span<T>以前はとして知られていましたarray_view<T>

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.