• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

동적배열 질문 드립니다.

21.07.07 16:02 작성 조회수 89

0

1. 동적배열 구현하는 강의를 보고 따라서 구현했는데요,  중단점을 걸어보면 capacity가 1,2,4.. 식으로 늘어나는데 C#에 이미 구현되어있는 List를 사용하여 중단점을 걸어보니 capacity가 4부터 시작해서 4,8,16..으로 늘어났는데, 이미 구현된 List는 DefaultSize가 4로 설정이 되어있는 건가요? 

2. 동적 배열에서 원소 Remove시에 총 배열의 크기(사용하던 크기 + 예약된 크기)는 원래 줄어들지 않는건가요? 예를 들어서 5개의 원소를 넣었다가 3개를 삭제하여도 capacity가 8이 유지가 되는데, 이미 구현된 List를 사용할 시에도 극단적으로 많이 넣었다가 많이 삭제하여도 늘어났던 capacity가 유지가 되는지 궁금합니다. 메모리가 낭비되는것이 아닌가요?

3. 

T[] newArray = new T[_count * 2];

                for (int i = 0; i < _data.Length; i++)

                    newArray[i] = _data[i];

                _data = newArray;

(배열 크기 늘리는 부분)

이 부분에서 마지막에, _data 가 newArray를 가르키도록 하고 있는데요,  이러면 _data가 가르키던 _data배열은 c#이라서 Heap메모리 에서 자동으로 사라지는지, 혹시 아니라면 배열의 크기를 늘릴때마다 newArray가 힙에 계속 생겨나서 안사라지는건지 궁금합니다. (이 부분은 제가 메모리 부분 이해를 잘못 한 걸수도 있습니다.)

답변 1

답변을 작성해보세요.

0

1.
말씀주신 테스트 케이스를 보니 그런 것 같네요.
사실 그건 동적배열 구현마다 다르기 때문에
C++ vector라거나 C# List라거나 다 다를 수 있습니다.

2.
당장은 메모리 낭비가 맞지만,
한 번 찍은 데이터 개수는 앞으로도 또
필요하다고 판단하기 때문에 ,굳이 날리지 않는 것입니다.
정말 필요하다고 판단되면 프로그래머 직접 capacity를 변경할 수도 있기 때문이죠.

3.
C#에서 참조형은 자동 관리되고,
어디서도 참조되지 않으면 GarbageCollector가 적당한 시점에 메모리 정리를 진행합니다.
따라서 위 코드에서 이전 _data가 가리키던 메모리는 언젠가 날라갑니다.
(그 시점이 당장은 아닐 수도 있고, GC 가 결정합니다)

상병님의 프로필

상병

질문자

2021.07.07

빠르고 친절한 답변 감사드립니다. 공부에 정말 많은 도움이 됩니다.