일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 영국생활
- 영국코로나
- 영국개발자
- 해외취업
- php
- 영국 워킹홀리데이
- 영국이직
- 해외개발자
- Python
- 맨체스터개발자
- 맨체스터 트램
- 영국 개발자
- 영국 배우자비자 연장
- 영국세금
- 맨체스터 일상
- 맨체스터생활
- 맨체스터 개발자
- laravel
- 맨체스터일상
- 맨체스터
- 맨체스터근교
- 영국일상
- 영국워킹홀리데이
- 영국구직
- 영어이메일
- 영국 워홀
- 파이썬
- 영국워홀
- 영국취업
- 영국 배우자비자
- Today
- Total
맨체스터 사는 개발자
[C++] vector 의 메모리 사용 본문
C++ 로 개발하면서 vector 의 중요성은 말할 필요도 없고 iterators 나 modifiers 사용법은 흔하기 때문에 오늘은 vector 의 메모리 사용에 대해서 정리.
벡터는 배열과 마찬가지로 연속적인 저장 위치를 사용하기 때문에 배열처럼 대괄호로 접근할 수 있다.
벡터의 크기가 동적으로 변하기 때문에 가끔 벡터를 linked list 로 생각하는 사람들이 있는데 이는 틀린 것이다.
https://stackoverflow.com/questions/4700052/are-vector-a-special-case-of-linked-lists
내부적으로 벡터는 동적으로 할당 된 배열을 사용하여 element 를 저장하는데, 새 element 가 추가 될 때 할당 된 배열이 다 찼다면 크기를 늘리기 위해 재할당해야 함.
위에서 말 했듯이 vector 는 linked list 가 아니고 배열이기 때문에 배열 크기가 다 찼다면, 새로운 사이즈의 배열을 생성하고 기존의 배열에 있던 element 를 새 배열로 이동시켜야 함. 당연히 이런 작업은 비용이 많이 듬
따라서 vector 스스로 재할당 가능성을 최소화 하도록 실제로 필요한 양보다 더 많이 할당 받음. 아래 블로그를 보면 기존의 capacity 의 1.5 배씩 늘어나는 것으로 보임
capacity 변화 순서 : 3 > 4 > 6 > 9 > 13 > 19
https://midason.tistory.com/150
따라서 가능하다면 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 을 써야 하는 경우도 있다고 한다. 이에 대한 내용은 아래 블로그 참조
'개발 > C++' 카테고리의 다른 글
[C++] wstring to int, int to wstring (0) | 2021.08.17 |
---|---|
[C++] wstring 구분자로 split (0) | 2021.08.17 |
객체지향 관련 영어 인터뷰 질문 및 답변 (0) | 2021.06.11 |
[맨체스터개발자/Modern C++] Structed Binding (0) | 2021.05.20 |
[맨체스터개발자/Modern C++] noexcept 키워드 (0) | 2021.05.20 |