Gsl kitaplığındaki span ve array_view arasındaki fark nedir?


94

Son zamanlarda yapılan birkaç konferans sunumunda Bjarne Stroustrup ve diğerlerinin C ++ için yeni kodlama yönergelerinden ve bunları destekleyen bazı türlerden bahsettiğini duydum.

Spesifik olarak, bir fonksiyonun parametresi yerine örneğinispan<T>(T* p, int n) hatırlıyorum (konuşmaya saat 32: 00'da); ama kullanma önerisini de hatırlıyorum array_view<T>. Bunlar iki alternatif ama aynı konsept mi? Yoksa ben kafa karıştırıcı mıyım ve aslında pek alakalı değiller mi?

İkisinin de neyle ilgili olması gerektiğine dair güvenilir bir tanım bulamıyorum.


@DavidHaim: Düzenlemeye bakın, örneğin burada .
einpoklum

Doğada dizi görünümü uygulamaları ve önerileri vardır. Onlara baktın mı?
Yakk - Adam Nevraumont

1
Sanırım bunun array_viewolarak yeniden adlandırıldı span.
Galik

@Galık: Kanıt verebilir misin? Mümkünse cevap olarak yazın ve kabul edeceğim ...
einpoklum

@Yakk: Evet, biraz, ama Microsoft C ++ AMP'nin bir parçası gibi, ille de ilişkili olmayan şeyler görüyorum array_view. Etrafta kayan adında birden fazla şey olabileceğini düşündüm .
einpoklum

Yanıtlar:


190

Biz insanlarla konuştum kütüphane çalışma grubu içinde standartları komitesi . array_viewStandarda girmeye çalıştıkları şeyin sadece okunmasını istediler . Temel kurallar için, okunan ve yazılan bir soyutlamaya ihtiyacımız vardı. Kitaplığı (GSL) desteği (potansiyel) standartları ve kuralları arasında bir çatışma önlemek için, bizim (okuma ve yazma) adını array_viewiçin span: https://github.com/microsoft/gsl .


42
Ve const array_view<T>artı array view<const T>tatmin edici değil miydi?
einpoklum

Sıfır maliyet soyutlama mantrasına bağlı kaldığınız için teşekkürler - gerçekten spançok sayıda programcıyı aptalca hatalar yapmaktan kurtaracağını düşünüyorum . Bu yeni değişiklikleri bildirmenin daha net bir şekilde yapılabileceğini düşünüyorum. Sadece merak ediyorum - bu, normal bir rastgele erişim yineleyicisiyle açıkça çözülebilecek bir şey olmaz mıydı? Tip sadece açıklık için mi eklendi?
Benjamin Gruenbaum

6
Bu, kaynaklar ve sarkan işaretçiler üzerine bir konuşmaydı. span ve GSL bir yan konuydu. Neil MacIntosh'un CppCon 2015 konuşmasına bir göz atın: "Güvenli C ++ kodu için gelişen array_view ve string_view" youtube.com/watch?v=C4Z3c4Sv52U ve / veya GSL kaynağına bir göz atın: github.com/microsoft/gsl . Biz ayrıca resmi (standart stil) bir spesifikasyon üzerinde çalışıyor.
Bjarne Stroustrup

5
"Görünüm" ün sadece içeriğe bakmayı, onları değiştirmeyi değil, bu yüzden bazı insanlar okuma / yazma versiyonu için farklı bir sonek istediği endişesi vardı. Varolan salt okunur bir dizi_görünüm tipini kimsenin umursadığını sanmıyorum. String_view, insanların varsayılan olarak salt okunur olmasını önemsiyor.
Jeffrey Yasskin

'Görünüm'ün yalnızca verilerin okuma / yazma içerisindeki mevcut görünümü anlamına geldiği bir grafik kodlayıcı olarak (örneğin, glViewPort, D3D'nin SetViewport'u), "görünümü" salt okunur hale getirmek şaşırtıcı, ancak grafiklerin dışında, sanırım daha fazla "görünüm" hissi görebiliyordum bir okuma / yazma penceresinden çok salt okunur bir pencere gibi.
Dwayne Robinson

46

Gelen CppCoreGuidlines orijinal array_viewolarak değiştirildi span.

Bakınız: https://github.com/isocpp/CppCoreGuidelines/pull/377

Bu şekilde tanımlanmıştır:

span, dizilere erişmek için işaretçiler kullanmanın sınırları kontrollü, güvenli bir alternatiftir


2
Seni + 1'ledim ama Bjarne Stroustrup'un (gerçekten?) Cevabı daha ayrıntılı.
einpoklum

31
@einpoklum Hayır, anladım. Muhtemelen Bjarne Stroustrup'u benim yerime de seçerdim. (Koklamak) almamak (koklamak) (koklamak) kişisel (wahhhhhh) ...
Galik

2
Bu yorum bana içimde bir şeyler hissettirdi, benden de +1 ;-)
YePhIcK

11

Belge P0122R dan (2016/02/12) Kütüphane Evrim Çalışma Grubu (LEWG)
resmen tipini yeniden adlandırır array_viewiçinspan :

Değişiklik günlüğü

R0'a göre değişiklikler

  • Çeşidi değiştirildi ismi nereden önerilmektedir array_viewiçin spanKona toplantısında LEWG geri bildirimlerini takip.
  • [...]

Ayrıca okuyabiliriz:

Standart Üzerindeki Etkisi

Bu öneri saf bir kitaplık uzantısıdır. Standart sınıflarda, işlevlerde veya başlıklarda herhangi bir değişiklik gerektirmez. P0257'debyte önerilen tipe ve tür örtüşme davranışındaki değişikliklere bağlı olabilirse geliştirilebilir .

Bununla birlikte - eğer benimsenirse - bu yeni tip için bazı standart kütüphane işlevlerini aşırı yüklemek faydalı olabilir (bir örnek olabilir copy()).

spanstandart C ++ (C ++ 11) ile uygulanmıştır ve ticari ofis üretkenlik yazılımının yanı sıra C ++ kodu için ticari bir statik analiz aracı içinde başarıyla kullanılmaktadır. Açık kaynak, referans uygulaması https://github.com/Microsoft/GSL adresinde mevcuttur .

Bir sonraki bölümde, bu belgeler salt okunur ve okuma-yazma ( değiştirilebilir ) erişimlerini sunar:

Öğe türleri ve dönüştürmeler

spanValueTypesoyut bir sınıf türü olmayan eksiksiz bir nesne türü olması gereken şablon parametresi aracılığıyla öğe türüyle yapılandırılmalıdır . spankapsüllediği sıraya salt okunur veya değiştirilebilir erişimi destekler. Salt okunur verilere span<const T>erişmek için, kullanıcı bir tanımlayabilir ve değiştirilebilir verilere erişim için bir span<T>.

[...]


Ayrıca bkz.Kılavuzlar Destek Kitaplığı İncelemesi:span<T> Marius Bancila'dan (Mart 2016) şunları tanımlamaktadır span:

Kuralları Destek Kitaplığı açıklanan türleri ve işlevleri bazılarının bir Microsoft uygulamasıdır C ++ Çekirdek Yönergeleri tarafından tutulan Standart C ++ Vakfı . GSL tarafından sağlanan türler arasında span<T>eski adıyla array_view<T>.

span<T>işaretçiler (ve boyut sayacı) veya standart kaplar ( std::vectorveya gibi) yerine kullanılması önerilen, sahip olunmayan bir bitişik bellek aralığıdır std::array.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.