그냥 게임개발자

TArray - Add/Emplace 본문

Unreal스터디/TArray

TArray - Add/Emplace

sudoju 2024. 1. 2. 22:33

TArray(동적배열)

  • 언리얼 엔진의 가장 간단한 컨테이너 클래스이다.
  • 동일한 Type을 가져야 함.
  • 시퀀스 즉, 연결되어 있으므로 엘리먼트는 잘 정의된 순서를 갖으며 같은 유형을 가지기 때문에 몇 번째 요소를 가지고 올 때 바로 해당 주소를 가져올 수 있다.
  • 가장 자주쓰이는 컨테이너 클래스
  • 신속성, 메모리 효율성, 안전성을 염두에 두고 디자인 되었다.
  • 두 가지 프로퍼티로 정의된다.
    '엘리먼트 유형', '부로 얼로케이터(allocator)'
  • '엘리먼트 유형'은 배열에 저장되는 오브젝트 유형이며 동질성 컨테이너 즉, 같은 사이즈를 가진다.
    전부 엄격히 같은 유형으로 지정해야 한다.
    유형이 다른 엘리먼트를 하나의 TArray에 저장할 수 없다.
  • 얼로케이터(allocator)<- '메모리를 어떻게 관리하는지에 대한 지정' (일반적으로 사용하지는 않음)
    얼로케이터는 꽤 자주 생략되나 기본값은 1로, 대부분의 경우 적합한 값이다. 만약 기본 작동방식이 적합하지 않은 경우 직접 작성하면 된다.
  • TArray는 값 유형이며 int32나 float 같은 다른 내장형과 비슷하게 취급한다.
    즉, 동적 할당을 하지 않는다는 것이다.

  • 그래서 TArray 소멸 자체는 우리가 자연스럽게 클래스 멤버 변수나 스택에서 소멸을 해주면 되는데 곧 거기 들어있는 엘리먼트의 소멸로 이어진다.

  • 확장을 염두에 두지는 않았기에 new 및 delete로 생성 또는 소멸시키는 것은 좋지 않다.
  • 다른 TArray 변수에서 TArray 변수를 만들면 그 엘리먼트를 새 변수에 복사하며, 공유되는 상태는 없다.

 

배열 만들고 채우기

  • 배열을 만들려면 다음과 같이 정의한다.
TArray<int32> IntArray;
  • 엘리먼트 유형은 int32, FString, TsharedPtr 등과 같이 보통의 C++ 값 규칙에 따라 복사 및 소멸 가능한 값 유형은 어떤 것이든 가능.
  • 얼로케이터가 지정되지 않았으니 TArray는 기본 힙 기반 얼로케이터를 사용한다.
  • 이 시점에서는 아직 할당된 메모리가 없다.
  •  

TArray 채우기는 여러가지 방식으로 가능

 

Init

  • Init 함수로, 배열을 엘리먼트 사본 여러개로 채우는 것
IntArray.Init(10, 5);
// InitArray = [10, 10, 10, 10, 10];

 

Add / Emplace

 

  • Add와 Emplace 함수를 사용해서 배열 끝에 새 오브젝트를 만들 수 있음
TArray<FString> StrArr;
StrArr.Add    (Text("Hello"));
StrArr.Emplace(TEXT("World"));
// StrArr == ["Hello", "World"];
  • Add 와 Emplace의 차이점은 Add (또는 Push)는 엘리먼트 유형의 인스턴스를 배열에 복사 (또는 이동) 한다.
  • Emplace는 지정한 인수를 사용하여 엘리먼트 유형의 인스턴스를 새로 생성한다.
    즉, TArray 자체에서 생성한다.
  • 여기서 Emplace가 더 효율적이다.
  • 즉 우리 TArray<FString>의 경우 Add는 스트링 리터럴에서 임시 FString을 생성한 다음, 그 임시 내용물을 컨테이너 안의 새로운 FString으로 이동한다.
  • 반면 Emplace는 스트링 리터럴을 사용해서 FString을 직접 만든다.
  • 최종 결과는 같지만, Emplace는 임시 변수 생성을 하지 않는다.
  • FString 처럼 복잡한 값 유형은 퍼포먼스상 바람직하지 않은 경우가 많다.
  • 일반적으로 Emplace가 Add보다 좋은 점은 복사 내지 이동하는 불필요한 절차를 피할 수 있기 때문이다.
  • 사소한 유형에는 Add 그 외에는 Emplace를 사용하는 것이 좋다.
  • Emplcae가 Add 보다 효율이 떨어질 일은 절대 없지만, 가독성은 Add가 나을수도 있다.

 

'Unreal스터디 > TArray' 카테고리의 다른 글

TArray - Insert  (0) 2024.01.02
TArray - Insert  (0) 2024.01.02
TArray - AddUnique  (0) 2024.01.02
TArray - Append  (0) 2024.01.02
언리얼 컨테이너 라이브러리 - TArray  (1) 2024.01.02