ความแตกต่างระหว่าง span และ array_view ในไลบรารี gsl คืออะไร


94

ในการนำเสนอการประชุมล่าสุดหลายครั้งฉันเคยได้ยิน Bjarne Stroustrup และคนอื่น ๆ พูดถึงแนวทางการเขียนโค้ดใหม่สำหรับ C ++ และบางประเภทก็รองรับ

โดยเฉพาะฉันจำตัวอย่างของspan<T>แทนที่จะ(T* p, int n)เป็นพารามิเตอร์ของฟังก์ชัน (ในเวลาประมาณ 32:00 น. ในการพูดคุย); array_view<T>แต่ฉันยังจำคำแนะนำในการใช้ พวกเขาเป็นสองทางเลือก แต่มีแนวคิดเดียวกันหรือไม่? หรือว่าฉันกำลังสับสน แต่จริงๆแล้วมันไม่ได้เกี่ยวข้องกัน

ฉันไม่สามารถหาคำจำกัดความที่เชื่อถือได้ว่าทั้งคู่ควรจะเกี่ยวกับอะไร


@DavidHaim: ดูการแก้ไขและตัวอย่างที่นี่
einpoklum

มีการใช้งานมุมมองอาร์เรย์และข้อเสนอในไวลด์ คุณดูพวกเขาแล้วหรือยัง?
Yakk - Adam Nevraumont

1
ผมเชื่อว่าการเปลี่ยนชื่อเป็นarray_view span
Galik

@ กาลิก: ขอหลักฐานหน่อยได้ไหม? ถ้าทำได้เขียนเป็นคำตอบแล้วฉันจะยอมรับ ...
einpoklum

@Yakk: ใช่นิดหน่อย แต่ดูเหมือนว่าฉันจะเห็นสิ่งที่ไม่จำเป็นต้องเกี่ยวข้องกันเช่นส่วนหนึ่งของ Microsoft C ++ AMP เป็นต้นฉันคิดว่าอาจมีมากกว่าหนึ่งชื่อที่array_viewลอยอยู่รอบ ๆ
einpoklum

คำตอบ:


190

เราได้พูดคุยกับคนที่อยู่ในกลุ่มที่ทำงานห้องสมุดในคณะกรรมการมาตรฐาน พวกเขาต้องการให้array_viewพวกเขาพยายามเข้าสู่มาตรฐานเพื่อให้อ่านได้เท่านั้น สำหรับแนวทางหลักเราจำเป็นต้องมีนามธรรมที่อ่านและเขียนได้ เพื่อหลีกเลี่ยงการปะทะกันระหว่าง (ศักยภาพ) มาตรฐานและแนวทางการสนับสนุนห้องสมุด (GSL) เราเปลี่ยนชื่อของเรา (อ่านและเขียน) array_viewเพื่อspan: https://github.com/microsoft/gsl


42
และconst array_view<T>บวกarray view<const T>ไม่น่าพอใจ?
einpoklum

ขอขอบคุณที่มุ่งมั่นกับมนต์ไร้ค่าใช้จ่ายเป็นศูนย์ - ฉันคิดว่าspanจะช่วยโปรแกรมเมอร์จำนวนมากจากการทำผิดพลาดโง่ ๆ ฉันคิดว่าการสื่อสารถึงการเปลี่ยนแปลงใหม่เหล่านี้สามารถทำได้ชัดเจนขึ้น ฉันแค่สงสัย - นี่จะไม่ใช่สิ่งที่สามารถแก้ไขได้อย่างชัดเจนด้วยตัววนซ้ำการเข้าถึงแบบสุ่มปกติหรือไม่? มีการเพิ่มประเภทเพื่อความชัดเจนหรือไม่?
Benjamin Gruenbaum

6
นี่เป็นการพูดคุยเกี่ยวกับทรัพยากรและตัวชี้อันตราย ช่วงและ GSL เป็นปัญหาด้านข้าง ดูการพูดคุย CppCon 2015 ของ Neil MacIntosh:“ Evolving array_view และ string_view สำหรับโค้ด C ++ ที่ปลอดภัย” youtube.com/watch?v=C4Z3c4Sv52Uและ / หรือดู GSL ที่มา: github.com/microsoft/gslเราคือ นอกจากนี้ยังทำงานในข้อกำหนดที่เป็นทางการ (สไตล์มาตรฐาน)
Bjarne Stroustrup

5
มีความกังวลว่า "view" ส่อให้เห็นเพียงแค่ดูเนื้อหาไม่ได้แก้ไขดังนั้นบางคนจึงต้องการคำต่อท้ายที่แตกต่างกันสำหรับเวอร์ชันอ่าน / เขียน ฉันไม่คิดว่าจะมีใครสนใจเกี่ยวกับประเภท array_view แบบอ่านอย่างเดียวที่มีอยู่ เป็น string_view ที่ดูแลผู้คนเป็นแบบอ่านอย่างเดียวโดยค่าเริ่มต้น
Jeffrey Yasskin

ในฐานะที่เป็นตัวเข้ารหัสกราฟิกที่ 'view' หมายถึงมุมมองปัจจุบันของคน ๆ หนึ่งไปยังข้อมูลอ่าน / เขียน (เช่น glViewPort, SetViewport ของ D3D) การ "ดู" แบบอ่านอย่างเดียวนั้นน่าแปลกใจ แต่กราฟิกภายนอกฉันคิดว่าฉันสามารถมองเห็น 'มุมมอง' ได้มากกว่า เหมือนหน้าต่างอ่านอย่างเดียวมากกว่าหน้าต่างอ่าน / เขียน
Dwayne Robinson

45

ในCppCoreGuidlinesต้นฉบับarray_viewถูกเปลี่ยนชื่อเป็นspan .

ดู: https://github.com/isocpp/CppCoreGuidelines/pull/377

มีการอธิบายไว้ดังนี้:

span เป็นทางเลือกที่ปลอดภัยและปลอดภัยในการใช้พอยน์เตอร์เพื่อเข้าถึงอาร์เรย์


2
ฉัน +1 คุณ แต่คำตอบของ Bjarne Stroustrup (จริงเหรอ?) มีรายละเอียดมากกว่า
einpoklum

31
@einpoklum ไม่รับค่ะ ฉันอาจจะเลือก Bjarne Stroustrup แทนฉันด้วย ไม่ (ดม) เอา (ดม) มัน (ดม) ส่วนตัว (หวา) ...
กาลิก

2
ความคิดเห็นนั้นทำให้ฉันรู้สึกบางอย่างอยู่ข้างในดังนั้น +1 จากฉันด้วย ;-)
YePhIcK

11

เอกสารP0122R (2016-02-12) จากLibrary Evolution Working Group (LEWG)
เปลี่ยนชื่อประเภทarray_viewเป็นspan :

บันทึกการเปลี่ยนแปลง

การเปลี่ยนแปลงจาก R0

  • เปลี่ยนชื่อประเภทที่เสนอจากarray_viewเป็นspanตามคำติชมจาก LEWG ในการประชุม Kona
  • [... ]

เรายังสามารถอ่าน:

ผลกระทบต่อมาตรฐาน

ข้อเสนอนี้เป็นส่วนขยายของห้องสมุดล้วนๆ ไม่จำเป็นต้องมีการเปลี่ยนแปลงใด ๆ กับคลาสฟังก์ชันหรือส่วนหัวมาตรฐาน จะได้รับการปรับปรุงหากสามารถขึ้นอยู่กับbyteประเภทและการเปลี่ยนแปลงพฤติกรรมการใช้นามแฝงที่เสนอในP0257 P0257

อย่างไรก็ตาม - หากนำมาใช้ - อาจเป็นประโยชน์ในการโอเวอร์โหลดฟังก์ชันไลบรารีมาตรฐานบางอย่างสำหรับประเภทใหม่นี้ (ตัวอย่างเช่นcopy())

spanได้รับการใช้งานในมาตรฐาน C ++ (C ++ 11) และถูกนำมาใช้อย่างประสบความสำเร็จภายในเครื่องมือวิเคราะห์แบบคงที่เชิงพาณิชย์สำหรับรหัส C ++ รวมถึงซอฟต์แวร์เพิ่มประสิทธิภาพในสำนักงานเชิงพาณิชย์ แหล่งที่มาเปิดดำเนินการอ้างอิงที่มีอยู่ในhttps://github.com/Microsoft/GSL

ในบทถัดไปเอกสารนี้จะนำเสนอการเข้าถึงแบบอ่านอย่างเดียวและแบบอ่าน - เขียน ( เปลี่ยนแปลงได้ ):

ประเภทองค์ประกอบและการแปลง

spanต้องกำหนดค่าด้วยประเภทองค์ประกอบผ่านพารามิเตอร์ template ValueTypeซึ่งจำเป็นต้องเป็นประเภทวัตถุที่สมบูรณ์ที่ไม่ใช่ประเภทคลาสนามธรรม spanรองรับการเข้าถึงแบบอ่านอย่างเดียวหรือแบบเปลี่ยนได้สำหรับลำดับที่ห่อหุ้ม ในการเข้าถึงข้อมูลแบบอ่านอย่างเดียวผู้ใช้สามารถประกาศ a span<const T>และการเข้าถึงข้อมูลที่เปลี่ยนแปลงได้จะใช้ไฟล์span<T>.

[... ]


ดูคู่มือการสนับสนุนการทบทวนห้องสมุด:span<T>จาก Marius Bancila (มีนาคม 2016) กำหนด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.