이이프
IeF 제멋대로 세상
이이프
전체 방문자
오늘
어제

공지사항

  • ✔ Info
  • 전체 글보기 (56)
    • 💻프로그래밍 내용 정리 (55)
      • C (0)
      • C++17 (55)
    • 💻게임메이커 (0)
    • 💻언리얼엔진 (0)
    • 💻유니티 (0)
    • 🎈[팀&자작]게임소개 (0)
    • 📃게임제작기술 (0)
    • 🎨그림놀이 (0)
    • 📒대학생활 (0)
    • 😃잡담 (1)
    • 🕹게임성과 (0)
    • 💷자격증 (0)

블로그 메뉴

  • 방명록

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
이이프

IeF 제멋대로 세상

💻프로그래밍 내용 정리/C++17

[C++ 7.3.3] 가비지 컬렉션

2022. 8. 24. 16:28
728x90

가비지 컬렉션

가비지 컬렉션을 제공하는 환경이라면 프로그래머가 객체에 할당된 메모리를 직접 해제할 일이 거의 없다.

더 이상 참조하지 않는 객체는 런타임 라이브러리에 의해 일정한 시점에 자동으로 해제되기 때문이다.

 

C++은 자바나 C#과 달리 가비지 컬렉션이 기본으로 제공되지 않는다.

최신 버전의 C++은 스마트 포인터로 메모리를 관리할 수 있지만,

예전에는 new와 delete를 이용해 객체 수준에서 직접 메모리를 관리해야 했다.

 

가비지 컬렉션을 구현하는 기법 중에 표시 후 쓸기란 알고리즘이 있다.

가비지 컬렉터가 프로그램에 있는 모든 포인터를 주기적으로 검사한 뒤 여기서 참조하는 메모리를 계속 사용하고 있는지 여부를 표시한다. 한 주기가 끝날 시점에 아무런 표시가 되지 않은 메모리는 더 이상 사용하지 않는 것으로 간주하고 해제한다.

 

다음과 같은 방식으로 표시 후 쓸기 알고리즘을 C++에서 구현할 수 있다.

1. 모든 포인터를 쉽게 탐색하도록 포인터를 가비지 컬렉터에 리스트 형태로 등록한다.

2. 가비지 컬렉터가 객체의 사용 상태를 표시할 수 있도록 모든 객체가 클래스를 상속하게 만든다.

3. 객체에 동시에 접근하지 못하도록 가비지 컬렉터가 작동하는 동안 포인터를 변경할 수 없게 한다.

 

이런 식으로 가비지 컬렉터를 구현하려면 해야 할 일이 상당히 많다.

그냥 delete로 처리할 때보다 오히려 오류가 많이 발생할 수 있다.

구현된 가비지 컬렉터를 가져와도 모든 애플리케이션에 적합하지 않을 수도 있다.

 

가비지 컬렉터의 단점은 다음과 같다.

- 가비지 컬렉터가 작동하는 동안 프로그램이 멈출 수도 있다.

- 가비지 컬렉터가 있으면 소멸자가 비결정적으로 호출된다.

객체는 가비지 컬렉터에서 처리하기 전에는 제거되지 않기 때문에 객체가 스코프를 벗어나도 소멸자가 즉시 실행되지 않는다.

 

가비지 컬렉션 메커니즘을 구현하기는 상당히 어렵다.

잘못 구현할 수도 있고 프로그램의 속도가 느릴 가능성이 매우 높다.

 

 

'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글

[C++ 7.4.1] unique_ptr  (0) 2022.09.25
[C++ 7.3.4] 객체 풀  (0) 2022.08.24
[C++ 7.3.2] 커스텀 메모리 관리  (0) 2022.08.24
[C++ 7.3.1] 포인터 연산  (0) 2022.08.24
[C++ 7.2.2] 포인터와 배열2  (0) 2022.08.24
    '💻프로그래밍 내용 정리/C++17' 카테고리의 다른 글
    • [C++ 7.4.1] unique_ptr
    • [C++ 7.3.4] 객체 풀
    • [C++ 7.3.2] 커스텀 메모리 관리
    • [C++ 7.3.1] 포인터 연산
    이이프
    이이프
    게임 프로그래머 지망생 / Since 2022.08.14

    티스토리툴바