std::string_view

Min·2024년 7월 14일
0

CPP

목록 보기
10/14
post-thumbnail

std::string_view

C++17 버전부터 지원하는 기능입니다. std::string을 인자로 전달할 때 발생하는 불필요한 동적할당을 방지하기 위해서 사용합니다.
차이를 명확하게 알기위해서는 const std::string& 타입을 인자로 받을 때와 비교하면 됩니다.

#include <iostream>
#include <string_view>

int StrTest(std::string_view _value)
{
	int a = 0;
	return a;
}

int StrWrong(const std::string& _value)
{
	int a = 0;
    return a;
}

int main()
{
	std::string_view Strview = "asdasdasdasdsa"; 
    //어떤 형태의 문자열 데이터를 받아도, 데이터 그자체를 갖고 있는게 아니라
    //입력한 곳을 포인터로 가리킬뿐
	
	int strviewSize = sizeof(Strview); //크기 16byte의 자료형
	//8byte는 const char*(문자열 포인터, const이기 때문에 문자열 리터럴도 받을 수 있는거)
    //8byte는 unsigned __int64 (문자열의 size 저장)

	std::string Str = Strview.data(); //이런 경우에는 당연하게 str로 생성하겠죠

	char cstyle[10] = "what"; //c스타일 문자열
	
	//스트링 뷰를 사용하는이유
	Str = StrTest(Str); //std::stirng
    Str = StrTest("asdas"); //문자열 리터럴
	Str = StrTest(cstyle); //c스타일 문자열(char*)
	//어떤 형태의 문자열을 인자로 받아도 std::string의 복사생성자가 호출되지 않고 동적할당이 일어나지 않음

	//반면 const string&를 사용하는 경우
	Str = StrWrong(Str); //Call by Ref,복사생성자가 호출되지 않고 동적할당이 일어나지 않죠
	Str = StrWrong("asdas"); //문자열 리터럴 : 동적할당 일어남(std::string("asdas"))
	Str = StrWrong(cstyle); //c스타일 문자열 : 동적할당 일어남(std::string(cstyle))

	//이런 이유로 string_view를 씁니다.
}
profile
티내는 청년

0개의 댓글