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.