std::string_view
경우에 따라 더 빠릅니다.
먼저 std::string const&
데이터가 std::string
원시 C 배열이 아닌, char const*
C API에 의해 반환, std::vector<char>
일부 역 직렬화 엔진에 의해 생성됨 등이 아니어야합니다. 피하지 않는 형식 변환은 바이트 복사를 피하고 (문자열이 특정 std::string
구현에 대한 SBO¹ )는 메모리 할당을 피합니다.
void foo( std::string_view bob ) {
std::cout << bob << "\n";
}
int main(int argc, char const*const* argv) {
foo( "This is a string long enough to avoid the std::string SBO" );
if (argc > 1)
foo( argv[1] );
}
어떤 할당이 이루어없는 string_view
경우지만, 경우가있을 것입니다 foo
했다 std::string const&
대신의string_view
.
두 번째로 큰 이유는 복사본없이 부분 문자열로 작업 할 수 있기 때문입니다. 2 기가 바이트 JSON 문자열 (!) ²을 구문 분석한다고 가정하십시오. 로 구문 분석하면 std::string
노드의 이름 또는 값을 저장하는 각 구문 분석 노드가 복사됩니다. 는 원래 데이터를 2GB 문자열에서 로컬 노드로 합니다.
대신 std::string_view
s로 구문 분석 하면 노드 는 는 원래 데이터를 합니다. 이를 통해 구문 분석 중에 수백만 개의 할당을 줄이고 메모리 요구 사항을 절반으로 줄일 수 있습니다.
당신이 얻을 수있는 속도 향상은 단순히 말도 안됩니다.
이것은 극단적 인 경우이지만 다른 "하위 문자열을 가져와 함께 사용"하는 경우에도 string_view
.
결정에있어 중요한 부분은 std::string_view
입니다. 많지는 않지만 무언가입니다.
암시적인 null 종료를 잃어버린 것입니다. 따라서 동일한 문자열이 3 개의 함수에 전달되고 모두 null 종료자가 필요한 경우 std::string
한 번으로 변환하는 것이 현명 할 수 있습니다. 따라서 코드에 null 종결자가 필요한 것으로 알려져 있고 C 스타일 소스 버퍼 등에서 공급 된 문자열을 기대하지 않는 경우을 사용할 수 있습니다 std::string const&
. 그렇지 않으면std::string_view
.
만약 std::string_view
널 (null)로 종료되었다고 명시한 플래그가 있다면 (혹은 더 환상적인)std::string const&
.
를 std::string
사용하지 않는 const&
것이 a보다 최적 인 경우가 std::string_view
있습니다. 호출 후 문자열 사본을 무기한으로 소유해야하는 경우 값을 사용하는 것이 효율적입니다. SBO 케이스에 있거나 (할당되지 않고 문자 사본을 복제하기 위해 단지 몇 개의 문자 사본 만) 힙 할당 버퍼를 local로 이동할 수 있습니다 std::string
. 과부하 가 두 번 std::string&&
이고 std::string_view
빠를 수 있지만 약간만있을 수 있으며, 약간의 코드 팽창이 발생할 수 있습니다 (이로 인해 모든 속도 향상 비용이 발생할 수 있음).
¹ 작은 버퍼 최적화
² 실제 사용 사례.
std::string_view
(char * begin, char * end) 쌍의 추상화입니다.std::string
불필요한 사본을 만들 때 사용합니다 .