이득우의 언리얼 프로그래밍 Part1 - Unreal C++ 이해
Unreal Container Library 중 TArray와 TSet에 대해 공부했다.
Dynamic Array 자료 구조
STL의 vector와 동작 원리가 유사하다.
가장 자주 사용하는 자료 구조다.
1.1. 데이터가 순차적으로 모여있기 때문에 메모리를 효과적으로 사용
1.2. 캐시 지역성( Locality )으로 인한 성능 향상
1.3. 임의 데이터 접근이 빠르고, 고속으로 el를 순회하는 것이 가능하다.
1.4. 맨 끝에 데이터를 추가하는 비용이 작다.
2.1. 중간 삽입/삭제의 비용이 크다.
2.2. 데이터가 많아질 수록 검색, 삭제, 수정 작업이 느리다.
2.3. 많은 데이터에서 검색 작업이 빈번하다면, TArray 대신에 TSet을 사용
3.1. TArray가 소멸되면 el도 같이 소멸
3.2. el가 채워졌다가 모두 삭제된 TArray인 경우 slack이 남는다.
// MyGameInstance.cpp - Init()
const int32 ArrayNum = 10;
TArray<int32> Int32Array;
for (int32 ix = 1; ix <= ArrayNum; ++ix)
{
Int32Array.Emplace(ix);
}
// 일반적으로 조건문은 lambda로 작성한다.
Int32Array.RemoveAll(
[](int32 Val)
{
return Val % 2 == 0;
}
);
Int32Array += { 2, 4, 6, 8, 10 };
// Memcpy로 TArray 초기화
TArray<int32> Int32ArrayCompare;
int32 CArray[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
Int32ArrayCompare.AddUninitialized(ArrayNum);
FMemory::Memcpy(Int32ArrayCompare.GetData(), CArray, sizeof(int32) * ArrayNum);
ensure(Int32Array == Int32ArrayCompare);
// el 총합
int32 Sum = Algo::Accumulate(Int32Array, 0);
}
중복 없는 데이터 집합을 구축할 때 유용하게 사용
1.1. hash table 형태( key-value ): 빠른 검색
1.2. Dynamic Array 형태: 메모리 구성이 효율적 → 데이터를 빠르게 순회
1.3. 데이터를 삭제해도 재구축이 발생하지 않음
1.4. 비어있는 데이터가 있을 수 있음
1.4.1. 비어있는 메모리를 우선으로 채운다.
1.4.2. 가장 마지막 index부터 차례대로 채운다.
1.4.3. 순서가 보장되지 않는다.
2.1. TSet이 소멸되면 el도 같이 소멸
2.2. el가 채워졌다가 모두 삭제된 TSet인 경우 slack이 남는다.
2.3. 직접 만든 자료구조에서 TSet을 사용하기 위해서
operator==와 GetTypeHash를 override 해야 한다.
// MyGameInstance.cpp - Init()
int32 SetNum = 10;
TSet<int32> Int32Set;
for (int32 ix = 1; ix <= SetNum; ++ix)
{
Int32Set.Add(ix);
}
// 순서 판단
Int32Set.Remove(2);
Int32Set.Remove(4);
Int32Set.Remove(6);
Int32Set.Remove(8);
Int32Set.Remove(10);
Int32Set.Add(2);
Int32Set.Add(4);
Int32Set.Add(6);
Int32Set.Add(8);
Int32Set.Add(10);
Unreal C++도 결국 언어라서 다른 언어와 유사한 점이 많다.
그래도 익숙해지려면 오래 걸릴 것 같다.
compile time이 오래걸리고 Editor를 껐다 켜야하는 과정도 있기에, 하나의 code를 확인하기 번거롭기 때문이다.