[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++ 기반이기 때문에 메모리 관리를 잘해줘야하며 스마트 포인터를 적절히 사용하여 좋은 결과물을 만들어 보자!
'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 |