david's daily developer note

[C,C++] STL Container Reserve 본문

[Develop] Native/C++ , C

[C,C++] STL Container Reserve

mouse-david 2018. 5. 28. 17:20
728x90

emplace_back를 설명하고자 했던 글의 예제에서는 

emplace_back함수를 각 한번씩만 함수를 호출하여, 생성, 소멸 호출을 확인하였다.


https://totjang.tistory.com/entry/C-emplaceback

 

[C,C++] emplace_back

이 글에서는 STL의 컨테이너의 emplace_back() 함수를 알아보려 한다. 정확하게는 이동생성자가 선언된 클래스에서 복사생성자가 무시되는지를 확인해보려고 한다. emplace_back 함수와 push_back함수 호

totjang.tistory.com

1번 이상 수행하면 어떻게 될까? 

class test_move
{
public:
    test_move() {}
    test_move(int n) {}
    ~test_move() { cout << "test_move destructor" << endl; }
    test_move(const test_move& rhs) { cout << "test_move : copy constructor" << endl; }
    test_move(test_move&& rhs) { cout << "test_move : move constructor" << endl; }
};
//sample
std::vector<test_move> move;
for (unsigned n(0); n != 5; ++n)
	move.emplace_back(n);

결과 (move vector 소멸은 제외)

이동 생성자의 호출은 없지만, 복사 생성자가와 소멸자가 호출된다.

이유인 즉, STL vector는 연속된 메모리 공간을 유지해야하는데, capacity와 size가 같으면 연속된 메모리를 유지하고자, 

전체를 복사한 뒤, 이전에 잡은 메모리를 지우기 때문에 발생한다(reallocation).

push_back과 emplace_back의 성능은 클래스의 구현에 따라서 미세한 성능차이 일수 있다. 

하지만 컨테이너의 reallocation에 의한 생성,소멸은 성능에 치명적인 결과를 만들기도 한다.

삽입될 객체의 수를 이미 알고있다면 reserve를 통하여 capacity를 미리 정해주는 것이 성능에 도움이 된다.

std::vector<test_move> move;
move.reserve(5);

결과는 복사 및 소멸이 없다. 

삽입될 객체의 수는 모르지만 가능한 최대크기는 알 수 있고, 메모리 제약이 없다면

최대 capacity를 잡은뒤 shrink_to_fit함수를 통하여 사용하지않는 영역을 줄이는 방법도 가능하다.

하지만 이경우, 줄어든 영역의 수 만큼의 이동생성자와 소멸자가 호출된다.

728x90

'[Develop] Native > C++ , C' 카테고리의 다른 글

[C,C++] memory fragmentation - struct packing  (2) 2018.05.29
[C,C++] memory fragmentation  (0) 2018.05.29
[C,C++] emplace_back  (0) 2018.05.28
[C,C++] lvalue, rvalue  (0) 2018.05.25
[C,C++] Variadic Template  (0) 2018.05.17