string_view는 무엇입니까?


162

string_viewC ++ 17에 추가 된 C ++ Library Fundamentals TS ( N3921 ) 에서 제안 된 기능입니다.

내가 이해하는 한 문자열로 볼 수있는 것을 저장할 수있는 컨테이너 유형의보기 인 일종의 문자열 "개념"을 나타내는 유형입니다.

  • 이게 옳은 거니 ?
  • 표준 const std::string&매개 변수 유형이되어야 string_view합니까?
  • string_view고려해야 할 또 다른 중요한 점이 있습니까?

4
마지막으로 string_view를 도입하는 것이 작은 단계 일지라도 문자열에 다른 의미가 필요하다는 것을 알고 있습니다.
John Z. Li

답변:


183

"문자열 참조"및 "배열 참조"제안의 모든 종류의 목적은 이미 다른 곳에서 소유하고 있고 변경되지 않은보기 만 필요한 데이터를 복사하지 않도록하는 것입니다. string_view문제는 하나 개의 제안이다; string_ref그리고 라는 이전의 것들도있었습니다 array_ref.

아이디어는 항상 한 쌍의 포인터-첫 번째 요소와 일부 기존 데이터 배열 또는 문자열의 크기를 저장하는 것 입니다.

이러한 뷰 핸들 클래스는 값을 기준으로 저렴하게 전달 될 수 있으며 저렴한 서브 스트링 작업 (단순 포인터 증가 및 크기 조정으로 구현할 수 있음)을 제공합니다.

많은 문자열 사용은 실제로 문자열을 소유 할 필요가 없으며 문제의 문자열은 이미 다른 사람이 이미 소유하고있을 것입니다. 따라서 불필요한 사본을 피함으로써 효율성을 높일 수있는 진정한 잠재력이 있습니다 (저장할 수있는 모든 할당 및 예외를 고려하십시오).

원래 C 문자열은 null 종결자가 문자열 API의 일부라는 문제 때문에 어려움을 겪고 있었으므로 기본 문자열 (la strtok) 을 변경하지 않고 하위 문자열을 쉽게 만들 수 없었습니다 . C ++에서는 길이를 별도로 저장하고 포인터와 크기를 하나의 클래스로 래핑하여 쉽게 해결할 수 있습니다.

제가 생각할 수있는 C ++ 표준 라이브러리 철학의 한 가지 주요 장애물과 차이점은 이러한 "참조 적 뷰"클래스는 다른 표준 라이브러리와 소유권 의미가 완전히 다르다는 것입니다. 기본적으로 표준 라이브러리의 다른 모든 것은 무조건 안전하고 정확합니다 (컴파일하면 정확합니다). 이와 같은 참조 클래스를 사용하면 더 이상 사실이 아닙니다. 프로그램의 정확성은 이러한 클래스를 사용하는 주변 코드에 따라 다릅니다. 따라서 확인하고 가르치기가 더 어렵습니다.


19
배는 그 철학으로 항해 reference_wrapper하지 않았습니까?
Steve Jessop

5
@KerrekSB 따라 가지 않을 까봐 두렵습니다. "이러한 참조 뷰 클래스는 표준 라이브러리의 나머지와 완전히 다른 소유권 의미를 갖습니다" 부분 을 확장 할 수 있습니까? 분명하지 않습니다 : 매달려있는 참조 / 포인터와 다른 점은 무엇입니까? 또는 삽입으로 인해 무효화 된 반복자 (예 : std :: vector)? 우리는 이미 이러한 문제를 가지고 있으며, 비 소유 관점이 비 소유 포인터 / 참조 / 반복자와 비슷한 문제를 갖는 것이 매우 당연합니다.
Ali

5
@Ali : 다른 표준 라이브러리 컨테이너를 사용하는 경우 컨테이너를 사용하는 코드를 보면 코드의 정확성을 주장 할 수 있습니다. 그렇지 않다 string_view. (나는 당신이 깨진 코드를 작성할 수 없다고 말하지 않았다. 단지 그 깨진 부분은 로컬 이다.)
Kerrek SB

6
나는 그들과 함께 가지 않았다 놀랍 std::range에서 boost::iterator_rangeIMO는 string_view 생각보다 더 나은입니다 -
찰스 샐비어을

19
@nwp : 많은 사람들과 언어가 C ++의 끔찍한 기본값을 애도하게되었으며 "const"와 "unshared"가 기본값이고 "mutable"과 "shared"는 명시 적이며 드문 예외를 고려해야합니다.
Kerrek SB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.