Sự khác biệt giữa span và array_view trong thư viện gsl là gì?


94

Trong một số bài thuyết trình hội nghị gần đây, tôi đã nghe Bjarne Stroustrup và những người khác đề cập đến các hướng dẫn mã hóa mới cho C ++ và một số kiểu hỗ trợ chúng.

Cụ thể, tôi nhớ ví dụ về span<T>thay vì (T* p, int n)như một tham số cho một hàm (tại thời điểm khoảng 32:00 vào buổi nói chuyện); nhưng tôi cũng nhớ gợi ý để sử dụng array_view<T>. Họ có phải là hai lựa chọn thay thế nhưng cùng một khái niệm? Hay tôi đang nhầm lẫn mọi thứ và chúng thực sự không liên quan đến vậy?

Tôi dường như không thể tìm thấy bất kỳ định nghĩa có thẩm quyền nào về những gì cả hai đều phải nói về.


@DavidHaim: Xem chỉnh sửa, cũng như ở đây chẳng hạn.
einpoklum

Có các đề xuất và triển khai chế độ xem mảng trong tự nhiên. Bạn đã nhìn vào chúng chưa?
Yakk - Adam Nevraumont

1
Tôi tin rằng nó array_viewđã được đổi tên thành span.
Galik

@Galik: Bạn có thể cung cấp bằng chứng không? Nếu bạn có thể, hãy viết nó như là một câu trả lời và tôi sẽ chấp nhận ...
einpoklum

@Yakk: Vâng, có, một chút, nhưng tôi có vẻ thấy những thứ không nhất thiết phải liên quan, như một phần của Microsoft C ++ AMP, v.v. Tôi nhận thấy có thể có nhiều thứ được đặt tên array_viewtrôi nổi.
einpoklum

Câu trả lời:


188

Chúng tôi đã nói chuyện với những người trong nhóm công tác thư viện trong ủy ban tiêu chuẩn . Họ muốn array_viewhọ đang cố gắng đạt được tiêu chuẩn chỉ được đọc. Đối với các nguyên tắc cốt lõi, chúng tôi cần một bản tóm tắt được đọc và viết. Để tránh xung đột giữa các tiêu chuẩn (tiềm năng) và thư viện hỗ trợ hướng dẫn (GSL), chúng tôi đã đổi tên (đọc và ghi) của array_viewmình thành span: https://github.com/microsoft/gsl .


41
const array_view<T>cộng thêm array view<const T>không đạt yêu cầu?
einpoklum

Cảm ơn vì đã cam kết với câu thần chú giảm thiểu chi phí bằng 0 - tôi thực sự nghĩ rằng spansẽ giúp rất nhiều lập trình viên tránh được những lỗi ngớ ngẩn. Tôi nghĩ rằng việc truyền đạt những thay đổi mới này có thể được thực hiện theo cách rõ ràng hơn. Tôi chỉ tự hỏi - đây không phải là điều gì đó có thể được giải quyết rõ ràng với một trình lặp truy cập ngẫu nhiên thông thường? Loại được thêm vào chỉ để rõ ràng?
Benjamin Gruenbaum

6
Đây là một cuộc nói chuyện về tài nguyên và những con trỏ lơ lửng. khoảng thời gian và GSL là một vấn đề phụ. Hãy xem bài nói chuyện CppCon 2015 của Neil MacIntosh: “Phát triển array_view và string_view cho mã C ++ an toàn" youtube.com/watch?v=C4Z3c4Sv52U và / hoặc xem qua nguồn GSL: github.com/microsoft/gsl . Chúng tôi cũng làm việc trên một (phong cách tiêu chuẩn) đặc điểm kỹ thuật chính thức.
Bjarne Stroustrup

5
Có một lo lắng rằng "view" ngụ ý chỉ xem nội dung chứ không sửa đổi chúng, vì vậy một số người muốn có một hậu tố khác cho phiên bản đọc / ghi. Tôi không nghĩ rằng có ai quan tâm nhiều đến kiểu array_view chỉ đọc hiện có. Đó là string_view mà mọi người quan tâm ở chế độ chỉ đọc theo mặc định.
Jeffrey Yasskin

Là một lập trình viên đồ họa, trong đó 'view' chỉ có nghĩa là chế độ xem hiện tại của một người vào dữ liệu đọc / ghi (ví dụ: glViewPort, SetViewport của D3D), khiến cho "view" chỉ đọc là một điều đáng ngạc nhiên, nhưng bên ngoài đồ họa, tôi cho rằng tôi có thể nhìn thấy 'view' nhiều hơn giống như cửa sổ chỉ đọc hơn là cửa sổ đọc / ghi.
Dwayne Robinson

45

Trong CppCoreGuidlines Bản gốc array_viewđã được đổi tên thành span.

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

Nó được mô tả như vậy:

span là một giải pháp thay thế an toàn, được kiểm tra giới hạn cho việc sử dụng con trỏ để truy cập các mảng


2
Tôi đã +1 bạn, nhưng câu trả lời của Bjarne Stroustrup (thực sự?) Chi tiết hơn.
einpoklum

30
@einpoklum Không, tôi hiểu rồi. Tôi có lẽ cũng đã chọn Bjarne Stroustrup hơn tôi. Không (đánh hơi) lấy (đánh hơi) nó (đánh hơi) cá nhân (wahhhhhh) ...
Galik

1
Nhận xét đó khiến tôi cảm thấy có gì đó bên trong, vì vậy tôi cũng +1 ;-)
YePhIcK

11

Tài liệu P0122R (2016-02-12) từ Nhóm Công tác về Tiến hóa Thư viện (LEWG)
chính thức đổi tên loại array_viewthànhspan :

Changelog

Những thay đổi từ R0

  • Đã thay đổi tên của loại hình đang được đề xuất array_viewthành spansau phản hồi từ LEWG tại cuộc họp Kona.
  • [...]

Chúng ta cũng có thể đọc:

Tác động đến tiêu chuẩn

Đề xuất này là một phần mở rộng thư viện thuần túy. Nó không yêu cầu bất kỳ thay đổi nào đối với các lớp, hàm hoặc tiêu đề chuẩn. Nó sẽ được tăng cường nếu có thể phụ thuộc vàobyte loại và các thay đổi đối với hành vi răng cưa loại được đề xuất trong P0257 .

Tuy nhiên - nếu được thông qua - có thể hữu ích khi nạp chồng một số hàm thư viện chuẩn cho kiểu mới này (một ví dụ sẽ là copy() ).

spanđã được triển khai trong C ++ chuẩn (C ++ 11) và đang được sử dụng thành công trong một công cụ phân tích tĩnh thương mại cho mã C ++ cũng như phần mềm năng suất văn phòng thương mại. Nguồn mở, triển khai tham chiếu có sẵn tại https://github.com/Microsoft/GSL .

Trong chương tiếp theo, tài liệu này trình bày các quyền truy cập chỉ đọcđọc ghi ( có thể thay đổi ):

Các loại phần tử và chuyển đổi

spanphải được cấu hình với kiểu phần tử của nó thông qua tham số khuôn mẫu ValueType, được yêu cầu là kiểu đối tượng hoàn chỉnh không phải là kiểu lớp trừu tượng. spanhỗ trợ truy cập chỉ đọc hoặc có thể thay đổi đối với trình tự mà nó đóng gói. Để truy cập dữ liệu chỉ đọc, người dùng có thể khai báo a span<const T>và quyền truy cập vào dữ liệu có thể thay đổi sẽ sử dụng a span<T>.

[...]


Xem thêm Bản Đánh giá Thư viện Hỗ trợ Nguyên tắc:span<T> từ Marius Bancila (tháng 3 năm 2016) định nghĩa spanlà:

Các Hướng dẫn Thư viện hỗ trợ là một thi Microsoft của một số các chủng loại và chức năng được mô tả trong Hướng dẫn Lõi C ++ được duy trì bởi các tiêu chuẩn C ++ Foundation . Trong số các loại do GSL cung cấp làspan<T> trước đây được gọi là array_view<T>.

span<T>là phạm vi bộ nhớ liền kề không sở hữu được khuyến nghị sử dụng thay cho con trỏ (và bộ đếm kích thước) hoặc vùng chứa tiêu chuẩn (chẳng hạn như std::vectorhoặc std::array).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.