@einpoklum melakukan pekerjaan yang cukup baik untuk memperkenalkan apa yang span
ada dalam jawabannya di sini . Namun, bahkan setelah membaca jawabannya, mudah bagi orang baru untuk melakukan rentang untuk masih memiliki serangkaian pertanyaan yang tidak terjawab sepenuhnya, seperti berikut:
- Bagaimana
span
perbedaan dari array C? Mengapa tidak menggunakan salah satunya saja? Sepertinya itu hanya salah satu dari mereka dengan ukuran yang dikenal juga ...
- Tunggu, itu terdengar seperti
std::array
, bagaimana span
bedanya dengan itu?
- Oh, itu mengingatkan saya, bukankah itu
std::vector
seperti std::array
juga?
- Aku begitu bingung. :( Apa itu
span
?
Jadi, inilah beberapa kejelasan tambahan tentang itu:
KUTIPAN LANGSUNG DARI JAWABANNYA - DENGAN TAMBAHAN SAYA DALAM BOLD :
Apa itu?
A span<T>
adalah:
- Abstraksi yang sangat ringan dari urutan nilai-nilai tipe yang berdekatan
T
di memori.
- Pada dasarnya sebuah struct tunggal
{ T * ptr; std::size_t length; }
dengan banyak metode kenyamanan. (Perhatikan ini jelas berbeda dari std::array<>
karena span
memungkinkan metode aksesor kenyamanan, sebanding dengan std::array
, melalui pointer ke jenisT
dan panjang (jumlah elemen) dari jenis T
, sedangkan std::array
wadah aktual yang memegang satu atau lebih nilai - nilai jenisT
.)
- Tipe yang tidak memiliki (yaitu "tipe referensi" dan bukan "tipe nilai"): Tipe ini tidak pernah mengalokasikan atau membatalkan alokasi apa pun dan tidak membuat pointer pintar tetap hidup.
Sebelumnya dikenal sebagai array_view
dan bahkan sebelumnya sebagaiarray_ref
.
Bagian yang berani itu penting untuk pemahaman seseorang, jadi jangan sampai ketinggalan atau salah baca! A span
BUKAN C-array struct, juga bukan merupakan struct dari C-array tipe T
plus panjang array (ini akan menjadi dasarnya std::array
wadah ), NOR apakah itu bukan C-array struct dari pointer untuk mengetik T
plus panjang, tetapi lebih merupakan struktur tunggal yang berisi satu pointerT
tunggal untuk mengetik , dan panjangnya , yang merupakan jumlah elemen (tipe T
) di blok memori yang berdekatan dimana pointer untuk mengetik T
poin ke! Dengan cara ini, satu-satunya overhead yang telah Anda tambahkan dengan menggunakan aspan
adalah variabel untuk menyimpan pointer dan panjang, dan fungsi aksesor kenyamanan yang Anda gunakanspan
menyediakan.
Ini adalah UNLIKE std::array<>
karena std::array<>
sebenarnya mengalokasikan memori untuk seluruh blok yang bersebelahan, dan itu UNLIKE std::vector<>
karena a std::vector
pada dasarnya hanya std::array
yang juga tumbuh dinamis (biasanya dua kali lipat) setiap kali mengisi dan Anda mencoba menambahkan sesuatu yang lain ke dalamnya . Sebuah std::array
adalah tetap dalam ukuran, dan sebuah span
bahkan tidak mengelola memori dari blok itu menunjuk, itu hanya poin ke blok memori, yang tahu berapa lama blok memori, tahu apa tipe data dalam C-array dalam memori, dan memberikan kemudahan akses atau fungsi untuk bekerja dengan elemen-elemen dalam memori yang berdekatan .
Ini adalah bagian dari standar C ++:
std::span
adalah bagian dari standar C ++ pada C ++ 20. Anda dapat membaca dokumentasinya di sini: https://en.cppreference.com/w/cpp/container/span . Untuk melihat cara menggunakan Google absl::Span<T>(array, length)
di C ++ 11 atau lebih baru hari ini , lihat di bawah.
Deskripsi Ringkasan, dan Referensi Kunci:
std::span<T, Extent>
( Extent
= "jumlah elemen dalam urutan, atau std::dynamic_extent
jika dinamis". Rentang hanya menunjuk ke memori dan membuatnya mudah diakses, tetapi TIDAK mengelolanya!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>
(perhatikan ukurannya tetapN
!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T>
(secara otomatis tumbuh dalam ukuran sesuai kebutuhan):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
Bagaimana Saya Dapat Menggunakan span
C ++ 11 atau lebih baru hari ini ?
Google telah membuka sumber pustaka C ++ 11 internal mereka dalam bentuk pustaka "Abseil" mereka. Pustaka ini dimaksudkan untuk menyediakan C ++ 14 hingga C ++ 20 dan di luar fitur yang berfungsi di C ++ 11 dan yang lebih baru, sehingga Anda dapat menggunakan fitur besok, hari ini. Mereka bilang:
Kompatibilitas dengan Standar C ++
Google telah mengembangkan banyak abstraksi yang cocok atau cocok dengan fitur yang dimasukkan ke dalam C ++ 14, C ++ 17, dan seterusnya. Menggunakan versi Abseil dari abstraksi ini memungkinkan Anda untuk mengakses fitur-fitur ini sekarang, bahkan jika kode Anda belum siap untuk digunakan di dunia postingan C ++ 11.
Berikut beberapa sumber dan tautan utama:
- Situs utama: https://abseil.io/
- https://abseil.io/docs/cpp/
- Repositori GitHub: https://github.com/abseil/abseil-cpp
span.h
header, dan absl::Span<T>(array, length)
kelas templat: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::span
diusulkan pada 2017. Ini berlaku untuk C ++ 17 atau C ++ 20. Juga lihat P0122R5, span: bounds-safe views untuk urutan objek . Apakah Anda benar-benar ingin menargetkan bahasa itu? Ini akan menjadi tahun sebelum kompiler mengejar ketinggalan.