vector와 array 컨테이너 클래스는 비슷하면서 다릅니다. 그래서 어떤 경우에 어떤 것을 사용할지 고민하는 경우가 있습니다. 하지만 둘 간에 차이가 명확하기 때문에 아래와 같은 선택 기준을 가지면 앞으로는 명확히 선택하실 수 있습니다.
std::vector<T>의 특징
std::vector는 가변 사이즈를 지원합니다. 이를 위해서는 크기가 동적으로 변경 가능하기 때문에, 구성 메모리 공간과 관계없이 동적으로 유지되는 버퍼가 할당되어야 합니다. 실제로 이는 버퍼링 된 콘텐츠에 대한 동적 메모리(힙) 할당이 필요함을 의미합니다. 만약 처리할 항목 수가 제한 가능한 크기의 컨테이너를 사용할 경우는, std::vector의 경우 필요한 것보다 고비용 메모리 할당을 사용합니다.
std::array<T, N>의 특징
생성에 필요한 파라미터에 보다시피 크기가 고정됩니다. C/C++ 언어의 기본 array와 동일합니다. 이 고정 크기의 컨테이너는 스택 할당을 이용한 메모리 구성과 잘 맞습니다. 그리고 이것은 추가적인 보너스로 CPU 캐싱과 함께 잘 작동합니다. 이 고정 크기는 메모리 추가 할당 비용이 거의 제로에 가깝습니다.
결론, 어떤 경우에 vector와 array를 사용?
vector를 선택하는 기준
크기가 가변적으로 변하는 경우는 vector를 사용할 수밖에 없습니다. 그리고 메모리와 성능을 전혀 고려하지 않아도 되는 경우는 고민 없이 vector를 사용해도 무방합니다.
array를 선택하는 기준
사이즈가 고정으로 변할 경우가 없는 경우에 사용 가능합니다. 그리고 메모리와 성능을 중요하게 생각한다면 array를 선택하는 게 훨씬 이득입니다. 힙 메모리 사용을 줄이고 스택 메모리 위주로 사용하고 싶은 경우도 array를 사용합니다. (메모리 단편화 방지)
선택에 대한 부연설명
많은 실사용 사례에서 실제로 어떤 것을 사용했는지는 대부분 중요하지 않습니다. 일반 응용 프로그램의 경우 둘 중 하나를 사용하면 성능에서 실제적인 차이를 느끼지는 않을 것입니다. 하지만 성능이 최고 중요한 프로그램의 경우 상황은 다릅니다. std::vector를 생각 없이 사용하면 많은 CPU 클록 주기를 낭비하게 되며 성능 최적화를 고려한다면 다시 std::array<T, N>을 다시 쳐다보게 될 것입니다.
'개발일기 > 설계와디자인' 카테고리의 다른 글
C++ 네임스페이스 사용 장점과 단점 (using namespace std) (0) | 2021.11.06 |
---|---|
std::vector<T>::const_iterator 사용방법 설명 (0) | 2021.11.06 |
데이터 중심 프로그래밍 (0) | 2008.09.29 |
댓글