Typing diary

String의 작동원리(c++) 본문

C, C++

String의 작동원리(c++)

Jcon 2022. 8. 17. 21:38

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