[C/C++] resize() vs reserve()

한우진·2023년 4월 16일
0

C++

목록 보기
2/4

앞선 string 정리 글에서 resize(); 와 reserve(); 차이에 대해서 간단히 언급했다. 좀 더 상세히 정리하고 머리에 새겨놓고 싶어서 따로 글을 정리해 올린다.

앞서 설명한 것 처럼 배열이나 문자열, 벡터에는 실질적으로 사용하고 있는 길이에 비해 여유롭게 메모리를 할당해준다.
그래서 예를 들어 문자열의 길이가 6인 str에서 str.size() == 6, str.capacity() == 15(예시 값)처럼 다른 값이 나오는 걸 확인할 수 있다. 얼마나 여유롭게 메모리를 할당하는지는 다르다고 한다.
그럼 size(), capacity()의 차이에 대해 이해했으니 reserve와 resize() 함수에 대해서 이해할 수 있다. 함수의 원형은 우선 이렇다.

vector::reserve

constexpr void reserve(size_type new_cap);

vector::resize

constexpr void resize(size_type count);
constexpr void resize(size_type count, const value_type& value);

resize(n); 는 문자열이나 벡터를 넣기 전에 미리 n만큼의 스트링이 들어올거니까 메모리 공간을 확보해놔라라는 이야기다. 따라서 n만큼의 capacity를 확장시켜 놓는데 이 함수는 주로 파일을 읽을 때 사용하곤 한다. 큰 파일이 계속해서 들어와 메모리를 늘려야 하는 연산이 방대하게 일어난다면 속도 저하가 우려되기 때문에 사용된다. 코딩 테스트에서는 사용할 일이 없겠지만 혹여나 나중에 실무나 면접에서 물어볼 일이 있을테니 잘 정리해둬야겠다.

예시

vector<int> arr1, arr2;
arr1.reserve(5000);
arr2.resize(5000);

cout << "arr1.size() : " << arr1.size() << '\n';
cout << "arr1.capacity() : " << arr1.capacity() << '\n';

cout << "arr2.size() : " << arr2.size() << '\n';
cout << "arr2.capacity() : " << arr2.capacity() << '\n';

결과는 위와 같다.

둘다 비어있는 벡터였지만 reserve()를 해준 arr1 벡터는 capacity만 5000이 나왔다. 함수 이름 처럼 미리 들어갈 메모리를 5000만큼 채우겠다고 예약하는 것과 똑같다.
resize()를 해준 arr2벡터는 capacity, size 둘다 5000이 나왔다. resize() 함수는 값을 정해주고 아무 값을 설정해주지 않으면 기본 값 0으로 전부 할당한다.

resize(n)에서 n이 기존 size보다 작을때는?

n만큼 size와 capacity를 줄여버리고 그 뒤에 짤리는 값들은 다 버린다.

shrink_to_fit();

사용은 str.shrink_to_fit(); 이다. 벡터에서도 똑같이 사용할 수 있다.
C+11에서 생긴 함수며 resize(), reserve()로 원하는 capacity 값을 설정해줄 수 있지만 메모리 공간이 낭비되는 경우가 허다하다. C+11 이전 버전에선 빈 벡터와 메모리가 누수되는 벡터를 swap해서 메모리를 관리했지만 shrink 함수를 사용해서 사용되는 스트링에 비해 허다하게 많이 남는 메모리를 효율적으로 알아서 줄여줄 수 있다.

0개의 댓글