"스팬"이란 무엇이며 언제 사용해야합니까?
최근 span<T>
에 내 코드에서의 사용 제안을 얻었 거나 사이트에서 span
일종의 컨테이너 를 사용하는 답변을 보았습니다 . 그러나 C ++ 표준 라이브러리에서 이와 같은 것을 찾을 수 없습니다.
그렇다면이 비밀은 무엇이며 span<T>
, 비표준 인 경우 왜 사용하는 것이 좋은가?
무엇입니까?
A span<T>
는 :
- 메모리 어딘가에 T 타입의 연속적인 값 시퀀스의 매우 가벼운 추상화입니다.
- 기본적으로
struct { T * ptr; size_t length; }
편리한 방법이 많이 있습니다. - 비 소유 유형 (예 : "값 유형"이 아닌 "참조 유형") : 어떤 것도 할당하거나 할당을 해제하지 않으며 스마트 포인터를 유지하지 않습니다.
이전에는로 알려져 있었고 이전에는로도 알려 array_view
졌습니다 array_ref
.
언제 사용해야합니까?
먼저 사용 하지 않을 때 :
- 코드에서 사용하지 마십시오 것은 단지 시작 및 끝 반복자의 쌍을 수있는 등
std::sort
,std::find_if
,std::copy
그 슈퍼 제네릭 템플릿의 모든 기능. - 코드에 적합한 표준 라이브러리 컨테이너 (또는 부스트 컨테이너 등)가있는 경우 사용하지 마십시오. 그것들을 대체하기위한 것이 아닙니다.
이제 실제로 사용할 때 :
사용
span<T>
(각각span<const T>
) 대신 독립T*
(각각const T*
있는 당신이 길이 값이). 따라서 다음과 같은 기능을 대체하십시오.void read_into(int* buffer, size_t buffer_size);
와:
void read_into(span<int> buffer);
왜 사용해야합니까? 왜 좋은가요?
아, 스팬은 대단해! 사용 span
...
즉, 화려하고 깔끔한 표준 라이브러리 컨테이너와 마찬가지로 포인터 + 길이 / 시작 + 끝 포인터 조합으로 작업 할 수 있습니다.
for (auto& x : my_span) { /* do stuff */ }
std::find_if(my_span.begin(), my_span.end(), some_predicate);
...하지만 대부분의 컨테이너 클래스에서 발생하는 오버 헤드는 전혀 없습니다.
컴파일러가 때때로 더 많은 작업을 수행하도록합니다. 예를 들면 다음과 같습니다.
int buffer[BUFFER_SIZE]; read_into(buffer, BUFFER_SIZE);
이된다 :
int buffer[BUFFER_SIZE]; read_into(buffer);
... 당신이 원하는 것을 할 것입니다. 지침 P.5 참조 .
const vector<T>&
데이터가 메모리에서 연속적 일 것으로 예상 될 때 함수 에 전달 하는 것의 합리적인 대안 입니다. 더 이상 전능 한 C ++ 전문가들에게 꾸짖지 않아도됩니다.- 정적 분석을 용이하게하므로 컴파일러가 바보 같은 버그를 잡는 데 도움을 줄 수 있습니다.
- 런타임 경계 검사를위한 디버그 컴파일 계측을 허용합니다 (예 :
span
메소드에는 경계 검사 코드가 있습니다#ifndef NDEBUG
...#endif
) - 는 (스팬을 사용하는) 코드가 포인터를 소유하지 않음을 나타냅니다.
C ++ 핵심 지침span
에서 찾을 수있는 s 사용에 대한 동기 부여가 더 많지만 드리프트를 잡습니다.
표준 라이브러리에없는 이유는 무엇입니까 (C ++ 17 기준)?
표준 라이브러리에 있지만 C ++ 20에서만 가능합니다. 그 이유는 2015 년 이후에야만 형성되고 있는 C ++ 핵심 지침 프로젝트 와 관련하여 현재의 형태로 여전히 새롭기 때문입니다. (코멘트가 지적한 것처럼, 초기 역사가 있습니다.)
So how do I use it if it's not in the standard library yet?
It's part of the Core Guidelines's Support Library (GSL). Implementations:
- Microsoft / Neil Macintosh's GSL contains a standalone implementation:
gsl/span
- GSL-Lite is a single-header implementation of the whole GSL (it's not that big, don't worry), including
span<T>
.
The GSL implementation does generally assume a platform that implements C++14 support [14]. These alternative single-header implementations do not depend on GSL facilities:
martinmoene/span-lite
requires C++98 or latertcbrindle/span
requires C++11 or later
Note that you can use it with earlier versions of the language standard - C++11 and C++14, not just C++17.
Further reading: You can find all the details and design considerations in the final official proposal before C++17, P0122R7: span: bounds-safe views for sequences of objects by Neal Macintosh and Stephan J. Lavavej. It's a bit long though. Also, in C++20, the span comparison semantics changed (following this short paper by Tony van Eerd).
참고URL : https://stackoverflow.com/questions/45723819/what-is-a-span-and-when-should-i-use-one
'Programing' 카테고리의 다른 글
React-Redux 및 mapStateToProps () 이해 (0) | 2020.05.11 |
---|---|
MacVim과 일반 Vim의 차이점은 무엇입니까? (0) | 2020.05.11 |
Java의 다이제스트와 외부 유틸리티의 다른 결과 (0) | 2020.05.11 |
일반적인 Haskell 연산자에 대한 명확한 이름이 있습니까? (0) | 2020.05.11 |
ui-bootstrap-tpls.min.js와 ui-bootstrap.min.js의 차이점은 무엇입니까? (0) | 2020.05.11 |