2012년 3월 9일 금요일

VC7에 포함된 STL list의 데이터 할당 구조

어디 까지나 VC7의 STL에만 해당되는 얘기지.. 다른 라이브러리는 검토한바 없으므로..

참고용으로만 알고 있자~.. ㅋㅋ



기본생성자에 의해 리스트 컨테이너가 만들어지면
최초 head-node가 1개 자동으로 만들어진다.



물론 노드안에는 짐작하는것과 같이 link 구조를 유지하기 위한
prev, next node를 가르키는 포인터 변수가 존재한다.
물론 데이터를 담기 위한 _Myval이라는 넘도 존재한다.


std::list<int> list1;



list를 하나 만들고 watch창으로 확인해보자..



list1
  |
  +-- allocator..
  |
  +-- _Myhead
  |      |
  |      +-- _Next
  |      |
  |      +-- _Prev
  |      |
  |      +-- _Myval
  |       
  +-- _Mysize



아무런 데이터가 없는 상태에서는 _Myhead의 주소와 _Next, _Prev의 주소가 같은것을 볼 수 있다.
물론 _Mysize는 0이다.



한개의 노드를 추가해보자.


list.push_back(100);


_Next, _Prev의 주소가 새로 추가된 노드의 주소로 변경된것을 확인할 수 있을것이다.
물론 _Mysize는 1로 바뀌었다



몇개의 노드를 더 추가해보고 살펴보면 링크 구조에서
Prev-node가 없거나 Next-node가 없을경우는 모두
처음에 생성한 head-node의 주소를 가르키는것을 확인할 수 있다.



어찌 보면 head-node가 연결되어 node들이 circle구조처럼 보일수도 있지만.
head-node의 기능은 end iterator의 기능일 뿐이니 오해하지 말자~.



다시 말해

list.begin()은 head-node의 next가 되는것이고
list.end()은 head-node 자신이 된다는 얘기이다..

댓글 없음:

댓글 쓰기