[C++20] std::span

연두비두밥·2024년 3월 12일
post-thumbnail

span class

template<class T, size_t Extent = dynamic_extent>
static_extent = 컴파일에 사이즈가 정해짐
dynamic_extent = 런타임에 사이즈가 정해짐

연속된 개체 시퀀스에 대한 간단한 보기를 제공한다.
이는 새로운 객체를 만드는 것이 아니라 기본 제공 배열, std::array, std::vector와 같은 연속된 개체의 참조(refer)를 제공
일반적으로 포인터와 인덱스 등을 사용하여 개체에 액세스 하는 것보다 span을 사용하는것이 더 안전하다.

  • 컴파일 타임에 템플릿 인수로 크기를 지정하거나,
    런타임에 크기를 설정할 수 있다.

span을 사용하는 이유

  1. C타입 배열의 경우 배열의 길이를 알려면 배열의 크기를 알아야 길이를 알 수있다. arr를 넘기는 경우는 포인터여서 단지 주소값만 넘기기 때문에 size도 같이 넘기지 않는다면 배열을 활용할 수 없다. 이런 경우 span을 사용하면 길이를 쉽게 알 수있다.
int arr[] = {1,2,3,4};
const int size = sizeof(arr);
const int len = sizeof(arr)/sizeof(int);
  1. 안전성 : std::span은 범위 확인을 제공하고 버퍼 오버플로우를 방지한다. 즉, 일반 C-array나 포인터를 사용하는 것보다는 안전하다. (이게 위에 나오는 길이와 비슷한 맥락이다.)

  2. 쉬운 사용성 : std::span은 배열 등 여러 연속적인 메모리 컨테이너를 다루는데 사용하기 편리한 메소드들과 인터페이스를 제공한다.

  3. 상호 운용성 : std::span은 여러 연속적인 메모리 컨테이너와 배열과 함께 사용될 수 있다. 그렇기 때문에 여러 STL의 알고리즘들과 함께 사용될 수 있다.

  4. 성능 : std::span은 일반 array를 사용하는 것보다 살짝 더 빠르고 안전하게 메모리 블럭을 참조할 수 있게 설계 되어있다.

참고 사이트

CPPReference_span
msdn_span

profile
꾸준하고 싶은 사람

0개의 댓글