midas+son의 크리에이티브(creative) 이야기

소스는 없다.

이전 포스팅을 첨고로 봐보도록 하자.

-------------------------------------------------------

벡터(vector)는 크기(size), 용량(capacity)를 별도로 가지고 있다.

capacity는 현재 벡터가 차지할 수 있는 메모리 전체영역이고

size는 영역내에 채워져서 사용되고 있는 부분이다.


배열이 고정된 메모리를 가지고 처리한다면 

벡터는 유동적인 메모리 공간을 가질 수 있다.

벡터는 유동적인 배열로 불러도 손색이 없다.


그럼 여기서 궁금한 것이 생각났다.

erase와 resize로 벡터의 원소를 빼앗을 경우 어떻게 되겠는가?


예를 들어본다.

용량은 8이고 원소는 아래와 같이

100 200 300 400 500

5개의 원소를 집어 넣었다.

그럼 현재 벡터의 메모리 내부는

100 200 300 400 500  ?  ?  ?

이렇게 채워져 있을 것이다.


벡터를 이용한 접근 가능한 부분을 파란색

접근 불가한 부분을 붉은 색으로 재표시 해보자.

100 200 300 400 500  ?  ?  ?

하지만 at()으로 접근 할 수 있는 것은

벡터 begin() + 4 까지이다.(여기서 begin()은 end() - 5와 같고 begin() + 4는 end() - 1과 같다.)

5이상 부터는 에러가 난다.


여기서 erase(begin() + 4)을 하면 500을 지우라는 명령이 된다.

하지만 실제 500이 지워지는가?

아니다. 지워지지 않는다. 그대로 그자리에 남아있다.

단 벡터를 이용한 접근이 불가할 뿐이다.

색을 주어서 표시해보자.

100 200 300 400 500  ?  ?  ?


위처럼 메모리 상에 값은 남아있다.

하지만 저 주소를 알지 못하는 이상 접근 할 수 없다.


다시 300을 뺀다면 어떻게 될까?

300은 400에 덮여씌워져 지워진다. 하지만 400이 남는다.

100 200 400 400 500  ?  ?  ?


여기서 또 100을 지웠다고 해보자.

그럼 아래와 같이 메모리내에 값 구성이 된다.

200 400 400 400 500  ?  ?  ?

이제 대충 보이는가?
벡터 자체에서 at()함수나 [인덱스]로 접근만 하지 못할 뿐 내부에 값은 남아있다.
남아 있기 때문에 
주소 값을 지우기 전에 미리 받아내거나
begin()주소부터 + 인덱스 로 접근도 가능하다.
조사식으로 확인이 가능하였고 캡쳐 이미지를 아래에 첨부하겠다.

[조사식 분석]


resize()도 마찬가지이다.

5개 원소가 들어있을 때 

resize(3)을 하면

3 만큼만 접근 가능 하게 만들고

나머지 4, 5번째는 접근이 안되게 만들 뿐 내부에 데이터는 남아 있다.


평소에는 생각해보지 못하고 그냥 사용했었지만

이렇게 하나하나 분석을 하고 나니 더욱 

벡터와 친해진 느낌이다.