Game Programming/UE4

[UE4] Smart Pointer

Doanie 2023. 10. 21. 19:37

[UE4] 스마트 포인터 (Smart Pointer)


스마트 포인터

메모리 할당과 추적의 부담을 해소해주도록 설계된 C++11 스마트 포인터들의 커스텀 구현인 언리얼 스마트 포인터 라이브러리이다. 단, 언리얼 오브젝트는 게임 코드에 더 최적화된 별도의 메모리 추적 시스템을 사용하기 때문에 이러한 클래스들은 ‘UObject' 시스템과 사용할 수 없다.

종류

공유 포인터(Shared Pointers),  포인터(Weak Pointers), 유니크 포인터(Unique Pointers) 가 포함되어 있으며, null이 불가능한(non-nullable) 쉐어드 포인터와 같은 역할을 하는 공유 레퍼런스(Shared References)가 있다. 

Shared Pointer (공유 포인터)

TSharedPtr<Type> sharedPointer;

오브젝트를 참조하며, 삭제 방지/ 참조하는 공유포인터가 없으면 오브젝트 소멸한다.

Weak Pointer (약 포인터)

TWeakPtr<Type> weakPointer;

공유 포인터와 비슷함. 하지만 소유하지 않기에 생명주기에 영향 못준다.

Unique Pointer (유니크 포인터)

TUniquePtr<Type> uniquePointer

참조하는 오브젝트를 유일하고 명시적으로 소유한다.

Shared Reference (공유 레퍼런스)

TSharedRef<Type> sharedRef;

공유 포인터와 같은 역할을 한다. 하지만 항상 null이 불가능한 오브젝트를 참조해야한다. 참조한 오브젝트가 null이 불가능한 오브젝트라는 것을 보장 하길 원하거나 공유된 오브젝트 소유권을 보여주길 원할 경우에 사용한다.

스마트 포인터 이점

이점
설명
메모리 누수 방지
스마트 포인터들은 (weak Ptr 제외) 더 이상 공유된 레퍼런스가 없으면 오브젝트가 자동 소멸
위크 레퍼런싱
위크 포인터는 참조 주기에 영향을 주지 않고, 삭제된 오브젝트를 참조하는(dangling) 포인터를 방지
선택적인 스레드 안전
언리얼 스마트 포인터 라이브러리에는 멀티스레드에 걸쳐 참조 카운팅을 관리하는 코드인 스레드 세이프(thread-safe) 코드가 포함되어 있습니다. 스레드 안정성이 필요하지 않다면 그 대신에 향상된 퍼포먼스를 구현 가능
런타임 안전성
쉐어드 레퍼런스는 절대 null 일 수 없으며 언제든지 참조 해제 가능
명확한 의도
관찰자 중에서 오브젝트의 소유자를 쉽게 분별 가능
메모리
스마트 포인터는 64 비트의 C++ 포인터 크기의 두 배. 단, 예외로 유니크 포인터만 C++ 포인터의 크기와 같음

스마트 포인터 단점

- 스마트 포인터의 생성/복사는 C++ 기본 포인터의 생성/복사보다 더 많은 오버헤드 발생
- 참조 카운트를 유지하면 기본 연산에 주기가 추가
- 일부 스마트 포인터는 C++ 기본 포인터보다 메모리 사용량이 높음

 C++에서는 사용자가 스스로 메모리를 할당 해제해주면서 관리를 해야한다. 그리고 이 과정을 확실히 처리해주지 못하면 메모리 누수같은 상황이 발생하는데 이와같은 상황을 방지하기 위해 스마트 포인터를 사용한다. 스마트 포인터 관련해서는 기존에 정리를 한적이 있다. 언리얼도 C++ 기반이기 때문에 메모리 관리를 잘해줘야하며 스마트 포인터를 적절히 사용하여 좋은 결과물을 만들어 보자!


https://doanhan.tistory.com/19

'Game Programming > UE4' 카테고리의 다른 글

[UE4] Timer Manager  (0) 2023.11.07
[UE4] BindWidget  (0) 2023.10.28
[UE4] Delegate  (0) 2023.09.17
[UE4] TMap  (0) 2023.09.09
[UE4] TArray  (0) 2023.09.02