Game Develop

[C++] vector사용 시, reserve를 해주자. 본문

C++/C++

[C++] vector사용 시, reserve를 해주자.

MaxLevel 2022. 11. 23. 18:45

미리 충분한 크기의 메모리를 확보하지 않은 vector같은 경우, capacity이상의 원소를 push 하려 할 경우, 재할당을 통해 capacity를 늘린다. (push든, insert든)

 

결과

v는 8개의 원소로 초기화되었기 때문에 초기 capacity값은 8이다.

그 상태에서 추가로 원소를 push한다면 메모리가 부족하기 때문에 더 큰 크기의 메모리로 재할당을 해줘야한다.

보통 1.5배 크기로 재할당 되며, 그렇기때문에 위 코드에서 푸쉬 후의 capacity는 8 * 1.5인 12가 재할당되었다.

메모리재할당은 런타임도중에 자주 일어나면 안되는 행위중 하나이다. 

이렇게 메모리재할당이 많아진다면 메모리단편화도 많이 발생할 것이다.

그렇기 때문에 만약 해당 vector에서 최대로 사용할 원소의 개수를 미리 알고 있다면, 해당값으로 미리 reserve해주는게 바람직하다.

 

또한 메모리재할당의 문제 뿐만 아니라 재할당 이후에 원소들을 새로운 메모리로 복사해야하기 때문에 더 좋지않다.

위의 코드를 예시로 들었을 때, 새 원소를 푸쉬하기 전에 0번지에 vector가 있었다고 가정하자.

그다음 원소를 푸쉬함으로써 새로운 메모리를 1000번지에 재할당 받았다면 0번지에 있던 원소들을 1000번지로 복사하고, 새로운 원소도 거기다가 push하게 되는것이다.

 

그리고 재할당하는 과정에서 이동생성자가 정의되어 있다면 이동생성자를 이용해 값을 이동시키게 된다.

만약 이동생성자호출에 의한 값이동이 이득인 경우, 이동생성자를 정의하는게 좋다.

 

이동생성자호출에 의한 값이동이 이득인 경우는 일단 개인적인 생각으로는 힙메모리를 가리키는 포인터변수가 있는 경우가 있다고 생각한다. 그냥 메모리주소값만 넘겨받으면 되기 때문이다. 

만약 그냥 복사생성을 한다면, 새 메모리 할당 뿐만 아니라 해당 메모리블럭에 값을 복사해야하기 때문에 차이가 꽤나 많이 날 것 같다.