CodeNote
Coding Note
CodeNote
전체 방문자
오늘
어제
  • 전체 보기 (35)
    • C++ (33)
      • Modern C++ (12)
      • Modern C++ STL (0)
      • Thread (16)
      • Thread (Async) (5)
    • 디자인패턴 (0)
    • Algorithm (2)
    • Electron (0)
    • Python (0)

블로그 메뉴

  • 홈
  • Github
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • C++
  • mutex
  • C++ #Memory
  • LOCK
  • Free

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
CodeNote

Coding Note

C++/Modern C++

[C++17] string_view

2022. 9. 7. 10:55

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
    'C++/Modern C++' 카테고리의 다른 글
    • [C++] constexpr
    • 스마트 포인터 문제 - 순환 참조
    • [C++20] std::span
    • [C++] 문자열 정리
    CodeNote
    CodeNote
    기록 블로그

    티스토리툴바