일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Game Development
- unity #graphics
- Serialize
- c#
- C
- 다익스트라
- graphics
- Programming
- game dev
- C++
- rendering
- untiy
- 알고리즘
- Addressables
- Unity
- Today
- Total
Typing diary
String의 작동원리(c++) 본문
c언어의 문자열은 다루기 매매매우 힘들다. (사실 귀찮다)
다행히 c에서 c++로 넘어오면서 string 클래스가 생기면서 문자열을 다루는 데 있어 훨씬 편해졌다.
하지만 편한 게 다일까? 사람이 편해졌다는 것은 사람이 하는 일을 그만큼 컴퓨터가 한다는 뜻이다.
다음 코드를 보자.
int main()
{
string str; str = "hello";
cout << sizeof(str) << endl; //28이 출력된다.
}
지역변수 str을 선언하면 string의 크기(28) 만큼 스택에 할당된다.
문자열을 늘리면 어떻게 될까?
int main()
{
string str;
str = "hellllllllllllllllllllo";
cout << sizeof(str) << endl; //똑같이 28이다.
}
문자열을 늘려도 똑같이 str의 크기는 28로 나온다.
그럼 string은 어떻게 문자열을 관리하는 걸까?

첫 번째 코드를 디버그 해보면 string의 크기가 28이었으니 캡처한 저만큼이 메모리에 할당된 str의 영역이다. str이 할당된 메모리에 hello 문자열이
포함돼 있는 걸 볼 수 있다.

두 번째 코드를 보면 첫 번째 코드에 문자열이 있던 메모리 위치에 문자열 대신 이상한 숫자만 가득하다.
저 숫자는 뭘까?
string.c_str() 함수를 이용하면 string이 가지고 있는 문자열의 첫 번째 주소를 알 수 있다.

두 번째 메모리 창이 pChar가 가지고 있는 메모리 주소이다.
첫 번째 코드에서 문자열을 가지고 있던 공간에 문자열 대신 문자열의 주소가 저장돼 있는 것을 알 수 있다.
주소가 거꾸로 저장돼 있는 이유는 리틀인디언? 때문이라고 한다. 나중에 찾아봐야겠다.
(파란 형광펜은 문자열의 크기를 저장하는 공간인 것 같다.)
결론
string이 지역변수로 선언되면 스택에 28byte가 할당되고, 문자열의 크기가 16byte 이하라면 할당된다. 28byte 중 16byte를 문자열을 저장하는데 사용된다.

문자열의 크기가 16byte 이상이면 힙 공간에 문자열을 저장하고 스택에서 문자열을 자장 하던 공간에 heap 주소를 가리키는 포인터를 저장한다.
이때 힙에는 16byte 단위로 공간이 할당된다. 이 크기를 알 수 있는 함수가 string.capacity()이다.

문자열의 크기가 힙에 할당했던 공간보다 커지면 다시 힙에 새로운 공간을 할당하고 string의 포인터는 그 공간을 가리키게 된다.
str.c_str() 함수는 string이 가지고 있는 포인터를 그대로 반환하는 함수라는 것을 알 수 있다.
또한 str.c_str() 함수가 const char*타입으로 반환하는 이유는 문자열 관리를 string이 하기 때문에 외부에서 문자열을 수정할 수 없도록 하기 위해서다.
결국 string은 내부에서 c 문자열을 그대로 사용하고 있고 사용하기 쉽게 포장해 놓은 것이다.
string을 사용하면 불가피하게 힙에 문자열이 저장될 가능성이 높기 때문에 문자열을 스택에서만 다뤄야 한다면 c 문자열을 사용해야 한다.
'C, C++' 카테고리의 다른 글
조정자(Manipulator) (0) | 2022.08.17 |
---|---|
c++ 참조와 포인터의 차이 (0) | 2022.08.17 |
void 포인터 (0) | 2022.08.16 |
c++ 연산자중복 (0) | 2022.08.16 |
c++ static멤버 (0) | 2022.08.16 |