https://www.youtube.com/watch?v=OfN94pLtnB8

String  은 Class로 Heap 영역에 할당 된다.

 

다만 C++ 11 부터 32 byte , 40 byte 씩  stack 에 class 가 선언이 되 있고 여기에 작은 string 들은 저장할 수 있어 성능을 높였다.

 

std::string 객체는 기본적으로 힙(heap) 영역에 할당됩니다. 하지만 C++11부터는 std::string 클래스가 작은 문자열의 경우 스택(stack) 영역에 저장될 수 있도록 최적화가 이루어졌습니다. 이 최적화는 SSO(String Small Object)라고 불리며, std::string 객체가 일정 크기 이하의 작은 문자열인 경우에만 적용됩니다.

SSO 최적화를 이용하면 문자열이 힙 영역에 할당되는 것보다 스택 영역에 할당될 때 더 빠른 성능을 얻을 수 있습니다. 이는 스택 영역의 메모리를 직접 할당하고 해제하는 것이 힙 영역의 메모리를 할당하고 해제하는 것보다 빠르기 때문입니다.

하지만, 문자열이 일정 크기 이상인 경우에는 여전히 힙 영역에 할당됩니다. 따라서 std::string 객체의 크기가 작은지 큰지에 따라 SSO 최적화가 적용되는지 여부가 결정됩니다. 이는 컴파일러 마다 다르며, 일반적으로 32바이트 이하의 작은 문자열에 대해 SSO 최적화가 적용됩니다

 

C++의 std::string 클래스 객체를 스택(stack) 영역에 할당하려면, 객체를 직접 선언하면 됩니다.

다음은 std::string 객체를 스택 영역에 선언하는 예시입니다.

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!"; // 스택(stack)에 할당된 std::string 객체
    
    std::cout << str << std::endl;
    
    return 0;
}

위 코드에서 std::string str = "Hello, world!";는 std::string 클래스의 객체인 str을 스택(stack) 영역에 할당합니다. 이후에 str 변수를 이용하여 문자열을 출력합니다.

std::string 객체의 크기가 작은 경우에는 SSO(String Small Object) 최적화가 적용되어 스택 영역에 할당될 수도 있습니다. 이는 std::string 클래스가 작은 문자열의 경우에만 적용되며, 객체의 크기에 따라 할당되는 영역이 결정됩니다.

 

 

저기서 hello world 가 많이 커지면 heap으로 간다는거지?
 

맞습니다. std::string 클래스는 일반적으로 문자열을 동적으로 할당하는 Heap 영역에 저장됩니다. 하지만 문자열이 작은 경우 SSO(String Small Object) 최적화가 적용될 수 있어 Stack 영역에 저장될 수도 있습니다.

SSO 최적화는 std::string 클래스의 내부 버퍼에 문자열을 저장할 때 Heap 영역 대신 Stack 영역을 사용함으로써 성능을 높입니다. 하지만 SSO는 작은 문자열의 경우에만 적용되기 때문에 문자열의 크기가 일정 수준 이상이면 Heap 영역에 저장됩니다.

따라서, 문자열의 크기가 매우 크다면 Heap 영역에 저장될 가능성이 높습니다. 만약 문자열이 매우 크다면 문자열을 처리하는 과정에서 메모리 부족 등의 문제가 발생할 수 있기 때문에 주의해야 합니다.

 

근데 그냥 스택에 해놓고 늘리면 되지 heap 으로 왜 바꾸는거야

 

스택(Stack)은 고정된 크기를 가진 메모리 영역이기 때문에, 스택에 할당된 std::string 객체를 동적으로 확장하는 것은 불가능합니다. 따라서 문자열의 크기가 동적으로 변하는 경우에는 Heap 영역에 저장해야 합니다.

std::string 클래스는 내부적으로 동적으로 할당된 문자열의 포인터와 문자열의 길이 정보를 저장하고 있습니다. 만약 문자열의 크기가 변한다면, 문자열을 저장하는 메모리 영역을 다시 할당하고 이전 문자열을 새로운 메모리 영역으로 복사해야 합니다. 이 작업은 Heap 영역에서만 가능합니다.

따라서, 문자열의 크기가 동적으로 변하는 경우에는 Heap 영역에 std::string 객체를 할당하고, 문자열의 크기가 고정된 경우에는 Stack 영역에 std::string 객체를 할당하는 것이 적절합니다.

+ Recent posts