문자열 뷰`는 C++17에 추가된 C++ 라이브러리 기초 TS([N3921][1)에서 제안된 기능입니다.
제가 알기로는 일종의 문자열 '개념'을 나타내는 유형으로, 문자열로 볼 수 있는 것을 저장할 수 있는 모든 유형의 컨테이너에 대한 뷰입니다.
매개변수 유형이
string_view`가 되어야 하나요?모든 종류의 '문자열 참조' 및 '배열 참조' 제안의 목적은 이미 다른 곳에 소유되어 있고 변하지 않는 보기만 필요한 데이터를 복사하지 않도록 하는 것입니다. 문제의 '문자열 참조'는 이러한 제안 중 하나이며, 이전에는 '문자열 참조'와 '배열 참조'라는 제안도 있었습니다.
아이디어는 항상 첫 번째 요소에 대한 포인터 쌍과 일부 기존 데이터 배열 또는 문자열의 크기를 저장하는 것입니다.
이러한 뷰 핸들 클래스는 값으로 저렴하게 전달할 수 있으며, (간단한 포인터 증분 및 크기 조정으로 구현할 수 있는) 저렴한 하위 문자열 연산을 제공할 수 있습니다.
문자열을 사용하는 많은 경우 문자열을 실제로 소유할 필요가 없으며, 문제의 문자열은 이미 다른 사람이 소유하고 있는 경우가 많습니다. 따라서 불필요한 사본을 피함으로써 효율성을 높일 수 있는 진정한 잠재력이 있습니다(절약할 수 있는 모든 할당과 예외를 생각해보세요).
원래 C 문자열은 널 종결자가 문자열 API의 일부이기 때문에 기본 문자열을 변경하지 않고는 하위 문자열을 쉽게 만들 수 없다는 문제가 있었습니다(예: strtok
). C++에서는 길이를 별도로 저장하고 포인터와 크기를 하나의 클래스로 래핑하면 이 문제를 쉽게 해결할 수 있습니다.
제가 생각할 수 있는 C++ 표준 라이브러리 철학에서 가장 큰 장애물이자 차이점은 이러한 '참조 보기' 클래스가 나머지 표준 라이브러리와 완전히 다른 소유권 의미를 갖는다는 점입니다. 기본적으로 표준 라이브러리의 다른 모든 것은 무조건 안전하고 정확합니다(컴파일되면 정확합니다). 이와 같은 참조 클래스를 사용하면 더 이상 그렇지 않습니다. 프로그램의 정확성은 이러한 클래스를 사용하는 주변 코드에 따라 달라집니다. 따라서 확인하거나 가르치기가 더 어렵습니다.