[c++] 컨테이너의 메모리 할당 방식

C++ 컨테이너는 메모리를 할당하고 해제하는 방식에 따라 여러가지 다른 동작을 합니다. 이러한 메모리 할당 방식은 컨테이너의 성능과 데이터 구조에 영향을 미칩니다.

메모리 할당 방식의 종류

C++ 표준 라이브러리는 다양한 컨테이너를 제공하며, 각 컨테이너는 메모리를 할당하는 다양한 방식을 사용합니다. 각각의 방식은 자신의 장단점을 가지고 있습니다.

  1. 정적 배열 (Static array): 크기가 고정된 배열로, 컴파일 시 크기가 결정됩니다.
  2. 동적 배열 (Dynamic array): 크기가 동적으로 할당되는 배열로, 크기가 변경될 수 있습니다.
  3. 리스트 (List): 이중 연결 리스트로 구현되며, 동적으로 할당됩니다.
  4. 맵 (Map) 및 셋 (Set): 보통 트리 구조로 구현되며, 동적으로 할당됩니다.

각 컨테이너의 메모리 할당 방식

정적 배열 (Static array)

정적 배열은 컴파일 시 크기가 결정되기 때문에 메모리 할당은 컴파일 시점에 이뤄집니다. 따라서 런타임에 메모리를 동적으로 할당하거나 해제할 필요가 없어 매우 효율적입니다. 하지만 크기가 고정되어 있기 때문에 변경이 불가능하며, 크기 제약이 있습니다. 정적 배열은 std::array로 구현됩니다.

#include <array>
std::array<int, 5> arr; // 크기가 5인 정적 배열

동적 배열 (Dynamic array)

동적 배열은 런타임에 메모리가 동적으로 할당되기 때문에 크기를 변경할 수 있습니다. 메모리 할당과 해제가 빈번하게 일어나며, 메모리 단편화가 발생할 수 있습니다. 동적 배열은 std::vector로 구현됩니다.

#include <vector>
std::vector<int> vec; // 동적 배열

리스트 (List)

리스트는 요소들이 메모리에 연결된 형태로 구현되어 있으며, 동적으로 할당됩니다. 요소의 삽입 및 삭제가 빠르지만, 인덱스를 통한 접근은 느리게 될 수 있습니다. 리스트는 std::list로 구현됩니다.

#include <list>
std::list<int> myList; // 리스트

맵 (Map) 및 셋 (Set)

맵과 셋은 일반적으로 트리 구조로 구현되어 있으며, 동적으로 메모리를 할당합니다. 삽입, 삭제, 검색 연산이 빠르지만 메모리 오버헤드가 크고 메모리 단편화가 발생할 수 있습니다. 맵과 셋은 각각 std::mapstd::set으로 구현됩니다.

#include <map>
#include <set>
std::map<int, std::string> myMap; // 맵
std::set<int> mySet; // 셋

결론

각 컨테이너의 메모리 할당 방식은 컨테이너의 동작 및 성능에 큰 영향을 미치므로, 프로젝트의 요구에 맞게 적절한 컨테이너를 선택하는 것이 중요합니다.

참고 문헌: cplusplus.com