gsl 라이브러리에서 span과 array_view의 차이점은 무엇입니까?


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

@Galik : 증거를 제공 할 수 있습니까? 당신은 대답으로 쓸 수 있습니다 내가 받아 들일 겁니다 경우 ...
einpoklum

@Yakk : 음, 예, 약간,하지만 Microsoft C ++ AMP 등의 일부와 같이 반드시 관련이있는 것은 아닌 것 같습니다. 이름이 array_view떠 다니는 것이 하나 이상있을 수 있다고 생각했습니다 .
einpoklum

답변:


188

우리는 사람들과 이야기 라이브러리 작업 그룹표준위원회 . 그들은 array_view표준에 들어 가려는 것이 읽기 전용 이기를 원했습니다 . 핵심 지침의 경우 읽고 쓸 수있는 추상화가 필요했습니다. 라이브러리 (GSL)을 지원하는 (잠재적) 표준과 가이드 라인 사이의 충돌을 방지하기 위해, 우리는 (읽기 및 쓰기) 이름 array_viewspan: https://github.com/microsoft/gsl .


41
그리고 const array_view<T>더하기 array view<const T>는 만족스럽지 않았습니까?
einpoklum

제로 비용 추상화 진언에 전념해 주셔서 감사합니다 span. 많은 프로그래머가 어리석은 오류를 범하는 것을 막을 수 있다고 생각 합니다. 나는 이러한 새로운 변화를 전달하는 것이 더 명확한 방법으로 이루어질 수 있다고 생각합니다. 나는 그냥 궁금해합니다. 이것은 정규 랜덤 액세스 반복기로 명확하게 해결할 수있는 것이 아닐까요? 명확성을 위해 유형이 추가 되었습니까?
Benjamin Gruenbaum

6
이것은 리소스와 매달려있는 포인터에 대한 이야기였습니다. 스팬과 GSL은 부수적 인 문제였습니다. Neil MacIntosh의 CppCon 2015 강연 : "안전한 C ++ 코드를위한 array_view 및 string_view 진화" youtube.com/watch?v=C4Z3c4Sv52U 및 / 또는 GSL 소스 ( github.com/microsoft/gsl)를 살펴보십시오 . 또한 정식 (표준 양식) 규격에서 작동합니다.
비얀 스트로브 스트 룹

5
"보기"는 내용을 수정하는 것이 아니라보기 만하는 것을 의미하므로 일부 사람들은 읽기 / 쓰기 버전에 대해 다른 접미사를 원했습니다. 나는 읽기 전용 array_view 유형이 존재하는 것에 대해 아무도 신경 쓰지 않는다고 생각합니다. 사람들이 기본적으로 읽기 전용으로 관심을 갖는 것은 string_view입니다.
제프리 Yasskin

'view'가 읽기 / 쓰기 데이터 (예 : glViewPort, D3D의 SetViewport)에 대한 현재보기를 의미하는 그래픽 코더로서, "view"를 읽기 전용으로 만드는 것은 놀랍지 만 그래픽 밖에서는 '보기'느낌이 더 많이 보인다고 생각합니다. 읽기 / 쓰기 창보다 읽기 전용 창과 같습니다.
드웨인 로빈슨

45

에서 CppCoreGuidlines 원본은 array_view이름이 바뀌 었습니다 span.

참조 : https://github.com/isocpp/CppCoreGuidelines/pull/377

다음과 같이 설명됩니다.

span은 배열에 액세스하기 위해 포인터를 사용하는 것보다 경계가 확인 된 안전한 대안입니다.


2
나는 당신을 +1했지만 Bjarne Stroustrup (정말?)의 대답이 더 자세합니다.
einpoklum

30
@einpoklum 아니요, 알겠습니다. 나도 Bjarne Stroustrup을 선택했을 것입니다. (킁킁) 개인적으로 (킁킁) 복용하지 (킁킁) 개인적인 (wahhhhhh) ...
Galik

1
그 의견은 내가 ;-)도 저에서 +1, 그래서 뭔가 내부 느낌
YePhIcK

11

문서 P0122R 로부터 (2016년 2월 12일) 도서관 발전 워킹 그룹 (LEWG)는
공식적 유형의 이름을 변경 array_view하는 방법에 대해span :

변경 로그

R0에서 변경

  • 코나 회의에서 제안되는 유형의 이름을 LEWG의 피드백 array_viewspan따르는 것으로 변경했습니다 .
  • [...]

우리는 또한 읽을 수 있습니다 :

표준에 미치는 영향

이 제안은 순수한 라이브러리 확장입니다. 표준 클래스, 함수 또는 헤더를 변경할 필요가 없습니다. P0257byte 에서 제안 된 유형 앨리어싱 동작 의 유형 및 변경 사항 에 따라 달라질 수 있다면 개선 될 것 입니다.

그러나-채택 된 경우-이 새로운 유형에 대해 일부 표준 라이브러리 함수를 오버로드하는 것이 유용 할 수 있습니다 (예 :) copy().

span표준 C ++ (C ++ 11)로 구현되었으며 C ++ 코드 용 상용 정적 분석 도구 및 상용 사무용 생산성 소프트웨어 내에서 성공적으로 사용되고 있습니다. 오픈 소스 참조 구현은 https://github.com/Microsoft/GSL 에서 사용할 수 있습니다 .

다음 장에서이 문서는 읽기 전용읽기-쓰기 ( 변경 가능 ) 액세스를 제공합니다.

요소 유형 및 변환

spanValueType추상 클래스 유형이 아닌 완전한 객체 유형이어야하는 템플릿 매개 변수를 통해 요소 유형으로 구성되어야합니다 . span캡슐화하는 시퀀스에 대한 읽기 전용 또는 변경 가능한 액세스를 지원합니다. 읽기 전용 데이터에 액세스하기 위해 사용자는를 선언 할 수 있으며 span<const T>변경 가능한 데이터에 대한 액세스는 span<T>.

[...]


가이드 라인 지원 라이브러리 검토 :span<T> Marius Bancila (2016 년 3 월) span에서 다음과 같이 정의하는 내용도 참조하세요 .

가이드 라인 지원 라이브러리 에 설명 종류와 일부 기능의 Microsoft 구현 한 C ++ 핵심 가이드 라인 에 의해 유지 관리 표준 C ++ 재단 . GSL에서 제공하는 유형 중 span<T>이전에는 array_view<T>.

span<T>포인터 (및 크기 카운터) 또는 표준 컨테이너 ( std::vector또는 등) 대신 사용하도록 권장되는 소유하지 않는 연속 메모리 범위입니다 std::array.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.