Programing

"스팬"이란 무엇이며 언제 사용해야합니까?

lottogame 2020. 5. 11. 07:58
반응형

"스팬"이란 무엇이며 언제 사용해야합니까?


최근 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:

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

반응형