Apa perbedaan antara span dan array_view di pustaka gsl?

94

Dalam beberapa presentasi konferensi baru-baru ini saya mendengar Bjarne Stroustrup dan yang lainnya menyebutkan pedoman pengkodean baru untuk C ++ dan beberapa jenis yang mendukungnya.

Secara khusus, saya ingat contoh span<T>alih - alih (T* p, int n)sebagai parameter untuk suatu fungsi (pada waktu sekitar 32:00 dalam pembicaraan); tapi saya juga ingat saran untuk digunakan array_view<T>. Apakah keduanya merupakan alternatif tetapi konsep yang sama? Atau apakah saya membingungkan hal-hal dan sebenarnya tidak begitu terkait?

Saya tidak bisa menemukan definisi otoritatif tentang apa yang seharusnya mereka berdua lakukan.

einpoklum
sumber
@DavidHaim: Lihat edit, serta di sini sebagai contoh.
einpoklum
Ada implementasi dan proposal tampilan larik di alam liar. Sudahkah Anda melihat mereka?
Yakk - Adam Nevraumont
1
Saya yakin array_viewitu diganti namanya menjadi span.
Galik
@ Galalik: Bisakah Anda memberikan bukti? Jika Anda bisa, tulislah sebagai jawaban dan saya akan menerima ...
einpoklum
@Yakk: Ya, sedikit, tapi sepertinya saya melihat hal-hal yang tidak selalu berhubungan, seperti bagian dari Microsoft C ++ AMP dll. Saya pikir mungkin ada lebih dari satu hal yang disebut array_viewmengambang.
einpoklum

Jawaban:

190

Kami berbicara dengan orang-orang di kelompok kerja perpustakaan di komite standar . Mereka ingin agar array_viewmereka mencoba menjadi standar untuk dibaca saja. Untuk pedoman inti, kami membutuhkan abstraksi yang dibaca dan ditulis. Untuk menghindari benturan antara standar (potensial) dan pustaka dukungan pedoman (GSL), kami mengganti nama (baca dan tulis) kami array_viewmenjadi span: https://github.com/microsoft/gsl .

Bjarne Stroustrup
sumber
41
Dan const array_view<T>plus array view<const T>tidak memuaskan?
einpoklum
Terima kasih telah berkomitmen pada mantra abstraksi biaya nol - Saya benar-benar berpikir spanakan menyelamatkan banyak programmer dari membuat kesalahan konyol. Saya pikir mengkomunikasikan perubahan baru ini bisa dilakukan dengan cara yang lebih jelas. Saya hanya bertanya-tanya - bukankah ini akan menjadi sesuatu yang dapat diselesaikan dengan jelas dengan iterator akses acak biasa? Apakah tipe ditambahkan hanya untuk kejelasan?
Benjamin Gruenbaum
6
Ini adalah pembicaraan tentang sumber daya dan petunjuk yang berbahaya. span dan GSL adalah masalah sampingan. Lihat ceramah Neil MacIntosh CppCon 2015: “Mengembangkan array_view dan string_view untuk kode C ++ aman" youtube.com/watch?v=C4Z3c4Sv52U dan / atau lihat sumber GSL: github.com/microsoft/gsl . Kami juga mengerjakan spesifikasi formal (gaya standar)
Bjarne Stroustrup
5
Ada kekhawatiran bahwa "view" menyiratkan hanya melihat isinya, bukan memodifikasinya, jadi beberapa orang menginginkan sufiks yang berbeda untuk versi baca / tulis. Saya tidak berpikir ada yang terlalu peduli tentang tipe array_view read-only yang ada. Ini adalah string_view bahwa orang peduli menjadi hanya-baca secara default.
Jeffrey Yasskin
Sebagai pembuat kode grafis di mana 'tampilan' hanya berarti tampilan saat ini ke dalam data baca / tulis (mis. GlViewPort, SetViewport D3D), membuat "tampilan" hanya-baca cukup mengejutkan, tetapi di luar grafis, saya kira saya bisa melihat perasaan 'tampilan' lebih banyak seperti jendela hanya-baca daripada jendela baca / tulis.
Dwayne Robinson
45

Dalam CppCoreGuidlines , aslinya array_viewdiubah namanya menjadi span.

Lihat: https://github.com/isocpp/CppCoreGuidelines/pull/377

Ini dijelaskan sebagai berikut:

span adalah alternatif yang diperiksa batasnya dan aman untuk menggunakan pointer untuk mengakses array

Galik
sumber
2
Saya memberi Anda +1, tetapi jawaban Bjarne Stroustrup (benarkah?) Lebih detail.
einpoklum
30
@einpoklum Tidak, saya mengerti. Saya mungkin akan memilih Bjarne Stroustrup daripada saya juga. Bukan (mengendus) mengambil (mengendus) itu (mengendus) pribadi (wahhhhhh) ...
Galik
1
Komentar itu membuat saya merasakan sesuatu di dalam, jadi +1 dari saya juga ;-)
YePhIcK
11

Dokumen P0122R (2016-02-12) dari Library Evolution Working Group (LEWG)
secara resmi mengganti nama jenis array_viewmenjadispan :

Changelog

Perubahan dari R0

  • Mengubah nama jenis yang diusulkan dari array_viewke spanberikut umpan balik dari LEWG pada pertemuan Kona.
  • [...]

Kami juga bisa membaca:

Dampak pada Standar

Proposal ini adalah ekstensi perpustakaan murni. Itu tidak memerlukan perubahan apa pun pada kelas, fungsi, atau header standar. Ini akan ditingkatkan jika bisa bergantung pada bytejenis dan perubahan pada perilaku aliasing tipe yang diusulkan di P0257 .

Namun - jika diadopsi - mungkin berguna untuk membebani beberapa fungsi library standar untuk tipe baru ini (contohnya copy()).

spantelah diimplementasikan dalam standar C ++ (C ++ 11) dan berhasil digunakan dalam alat analisis statis komersial untuk kode C ++ serta perangkat lunak produktivitas kantor komersial. Implementasi referensi open source tersedia di https://github.com/Microsoft/GSL .

Di bab berikutnya, dokumen ini menyajikan akses baca-saja dan baca-tulis ( bisa berubah ):

Jenis dan konversi elemen

spanharus dikonfigurasi dengan jenis elemennya melalui parameter template ValueType, yang diperlukan untuk menjadi jenis objek lengkap yang bukan jenis kelas abstrak. spanmendukung akses hanya-baca atau yang dapat diubah ke urutan yang dienkapsulasi. Untuk mengakses data hanya-baca, pengguna dapat mendeklarasikan a span<const T>, dan akses ke data yang dapat berubah akan menggunakan file span<T>.

[...]


Lihat juga Panduan Review Library Dukungan:span<T> dari Marius Bancila (maret 2016) yang didefinisikan spansebagai:

The Pedoman Support Perpustakaan adalah implementasi Microsoft dari beberapa jenis dan fungsi yang dijelaskan dalam Pedoman C ++ Inti dikelola oleh Standard C ++ Yayasan . Di antara tipe yang disediakan oleh GSL span<T>sebelumnya dikenal sebagai array_view<T>.

span<T>adalah rentang memori bersebelahan non-memiliki yang disarankan untuk digunakan sebagai pengganti pointer (dan penghitung ukuran) atau wadah standar (seperti std::vectoratau std::array).

oHo
sumber