string_view는 무엇입니까? 기능입니다. 내가 이해하는 한 문자열로

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

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

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


답변

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

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

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

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

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

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