C++에서 STL을 쓰는데 메모리초과가 나길래 STL에서 메모리가 어느정도 할당되는지 궁금해졌음
예를 들어서 이렇게 할당을 하면
vector<int> v;
deque<int> dq;
map<int, int> mp;
set<int> s;
string st;
queue<int> q;
를 한 후에 sizeof(v), sizeof(dq), sizeof(mp), ... 를 했더니
vector : 16
deque : 20
map : 12
set : 12
string : 28
queue : 20
이렇게 나오더라고
근데 여기서 궁금한게 vector는 그럼 1개를 push_back 하면 16바이트, 2개를 push_back 하면 32바이트, ... 이렇게 되는건가?
string의 경우에는 "a" = 28바이트, "ab" = 56바이트, ... 이렇게 되는 형태라고 생각이 드는데
뭔가 너무 메모리를 많이 잡아먹는거같아서 이해가 잘 안되네 이거 좀 설명해줄사람 있을까...?
https://cplusplus.com/reference/string/string/
이런
게 들어있으니까
그럼 string s = "abc"; 는 28 + 1 + 1 + 1 = 31바이트임??
32bit 환경이야? 뭔가 좀 이상한데
sizeof container를 하면 그 컨테이너가 소모하는 전체 메모리가 아니라, 그 컨테이너 클래스가 소모하는 메모리만 알려줌
이를테면 vector<T> vec이 소모하는 메모리를 정확히 알려면 sizeof(vec) + sizeof(T) * vec.capacity()야
vector는 배열의 시작 포인터, size, capacity만 저장하고 deque는 좀 데이터를 여러 개의 블록으로 쪼개서 저장하고 set, map은 red black tree고 string은 vector 방식으로 저장하고 queue는 그냥 deque임. 이건 컴파일러마다 다를 수 있어
오 ㄱㅅㄱㅅ 그럼 string이나 map 이런것도 전부다 sizeof + 자료형 x capacity 맞아?
근데 메모리 초과면 보통 원소가 너무 많아서 생길텐데
이 댓글은 게시물 작성자가 삭제하였습니다.
벡터나 스트링은 기본 메모리 있음