맨체스터 사는 개발자

[C++] vector 의 메모리 사용 본문

개발/C++

[C++] vector 의 메모리 사용

aaamy91 2021. 7. 1. 07:39

C++ 로 개발하면서 vector 의 중요성은 말할 필요도 없고 iterators 나 modifiers 사용법은 흔하기 때문에 오늘은 vector 의 메모리 사용에 대해서 정리.

벡터는 배열과 마찬가지로 연속적인 저장 위치를 사용하기 때문에 배열처럼 대괄호로 접근할 수 있다.

벡터의 크기가 동적으로 변하기 때문에 가끔 벡터를 linked list 로 생각하는 사람들이 있는데 이는 틀린 것이다.

 

https://stackoverflow.com/questions/4700052/are-vector-a-special-case-of-linked-lists

 

Are vector a special case of linked lists?

When talking about the STL, I have several schoolmates telling me that "vectors are linked lists". I have another one arguing that if you call the erase() method with an iterator, it breaks the ve...

stackoverflow.com

 

내부적으로 벡터는 동적으로 할당 된 배열을 사용하여 element 를 저장하는데, 새 element 가 추가 될 때 할당 된 배열이 다 찼다면 크기를 늘리기 위해 재할당해야 함.

위에서 말 했듯이 vector 는 linked list 가 아니고 배열이기 때문에 배열 크기가 다 찼다면, 새로운 사이즈의 배열을 생성하고 기존의 배열에 있던 element 를 새 배열로 이동시켜야 함. 당연히 이런 작업은 비용이 많이 듬

따라서 vector 스스로 재할당 가능성을 최소화 하도록 실제로 필요한 양보다 더 많이 할당 받음. 아래 블로그를 보면 기존의 capacity 의 1.5 배씩 늘어나는 것으로 보임

capacity 변화 순서 : 3 > 4 > 6 > 9 > 13 > 19

 

https://midason.tistory.com/150

 

[STL]벡터(vector)의 메모리 재할당에 대해

#include #include //벡터 출력 함수 void Print(std::vector & myvector) { std::vector ::iterator it; std::cout << "myvector contains:"; for (it = myvector.begin(); it < myvector.end(); it++) { std::co..

midason.tistory.com

 

 

따라서 가능하다면 vector 의 사이즈가 어느정도 될지 가늠해서 적절한 크기의 vector 를 생성하거나 처음부터 넉넉하게 생성한 뒤에 shrink_to_fit() 함수로 capacity 의 크기를 실제 크기로 맞추는게 좋음

그리고 push_back 보단 emplace 또는 emplace_back 사용을 권장.

push_back 은 '객체' 를 집어 넣는 형식으로 값을 넣는 과정에서 복사생성자를 호출하게 됨.

Item 클래스가 string 과 int 로 이루어져 있다고 가정하자

 

main()
{
	vector<Item> v;
    Item I("test", 1);
	v.push_back(I);
}

벡터에 Item 객체를 넣으려면

1. 객체가 push_back 함수에 파라미터로 전달 되면서 복사 생성자를 통해 push_back 함수 내에서 임시 객체 생성 (이해 안될 경우 C++ 생성자 부분 공부 필요)

emplace, emplace_back 함수는 C++11 부터 추가된 함수로 객체 생성에 필요한 인자만 받은 후 함수 내에서 객체를 생성해 삽입함.

 

main()
{
	vector<Item> v;
	v.emplace_back("Item", 1);
}

따라서 보통은 emplace_back 이 push_back 보다 빠르지만, push_back 을 써야 하는 경우도 있다고 한다. 이에 대한 내용은 아래 블로그 참조

https://openmynotepad.tistory.com/10