string_view (C++17)
C++17에서 string_view라는 기능이 추가되었다.
void printString(const std::string& s)
{
std::cout << s << std::endl;
}
int main()
{
char a[] = "stringStack";
const char* b = "stringReadonly";
std::string c = "stringHeap";
}
C++에서 위와 같이 3가지의 문자열을 표현할 수 있다. 그런데 위 3가지는 메모리 측면에서 모두 다르게 동작한다. 이러한 여러가지 타입의 문자열을 하나의 레퍼런스 인터페이스로 묶은 것이 string_view 이다.
printString 에 a 나 b 를 넘겨주어도 문제없이 컴파일된다. 그러나, 이를 실제로 실행시키면 성능이 떨어진다. char[] 나 char* 를 string 레퍼런스로 넘겨주는 순간 temp string이 만들어지게 되고, 이 string이 만약 새롭게 Heap allocation을 하게 되면 성능이 떨어지게 되는 것이다.
Heap allocation이 일어나지 않을 수 있는데 이것은 컴파일러가 알아서 SSO(small string optimization)을 한 것 뿐이지 문자열이 길다면 필수적으로 Heap allocation이 일어난다.
이럴 때 string_view를 사용하면 새로운 Heap allocation없이 문자열을 전달할 수 있다.
void printStringView(std::string_view s)
{
std::cout << s << std::endl;
}
int main()
{
char a[] = "stringStack";
const char* b = "stringReadonly";
std::string c = "stringHeap";
printStringView(a);
printStringView(b);
printStringView("stringLiteral"); // 리터럴도 가능하다.
}
내부 원리는 std::span(C++20)과 같다. 바로 string의 시작점과 길이를 가지고 있다는 것이다. 사용상의 주의점은 string_view는 레퍼런스이기 때문에 원본 문자열이 달라지면 string_view의 내용도 달라진다는 것이다. 즉, 원본 문자열의 라이프 사이클을 신경써야한다.
'C++ > Modern C++' 카테고리의 다른 글
[C++] Perfect forwarding (0) | 2022.10.05 |
---|---|
[C++] constexpr (0) | 2022.10.05 |
스마트 포인터 문제 - 순환 참조 (0) | 2022.10.03 |
[C++20] std::span (0) | 2022.10.01 |
[C++] 문자열 정리 (0) | 2022.09.29 |