그냥 게임개발자

TArray - Slack 본문

Unreal스터디/TArray

TArray - Slack

sudoju 2024. 1. 7. 22:19

슬랙

보통 메모리를 우리가 확보를 해야 배열을 만들 수 가 있는데 요소를 추가할 때마다 메모리를 하나씩 늘려서 확보하는 작업에 대한 오버헤드가 생기기 때문에 보통은 요청하는 것보다 넉넉한 메모리를 확보해서 그 다음에 데이터를 넣는 방식으로 진행이 된다.


그렇기 때문에 엘리먼트를 삭제한다고 해도 메모리가 바로 해지되지는 않는다.
Slack이라는 것은 여유분이다.
사용하지 않아도 사실상 미리 할당된 엘리먼트 저장 슬롯을 남겨주는 것이 효과적이라는 뜻이다.
그런데 이것이 계속해서 남아있으면 불필요한 낭비가 될 수가 있기에 남아있는 것들 조차도 다 제거해서 깔끔하게 정리를 할 수 있다.

 

문서 내용

배열은 크기변경이 가능하므로, 메모리 사용량이 가변적이다.배열이 추가될 때마다 매번 재할당을 피하기 위해, 얼로케이터는 보통 요청한 것보다 넉넉한 메모리를 제공하여 앞으로의 Add 호출시 재할당에 드는 퍼포먼스 비용을 물지 않도록 한다.마찬가지로 엘리먼트를 삭제한다고 메모리가 해제되지는 않으며, 배열에 Slack(여유분), 즉 현재 사용되지는 않아도 사실상 미리 할당된 엘리먼트 저장 슬롯을 남길 뿐이다.배열의 슬랙 양은 현재 컨테이너에 있는 엘리먼트의 수와 ,엘리먼트를 몇 개나 더 추가하면 다음 할당이 일어나는지에 대한 차이로 정의할 수 있다.기본 생성된 배열은 메모리 할당이 없으므로, 초기 슬랙은 0이다.GetSlack 함수를 사용하면 배열의 슬랙 크기가 얼마나 되는지 알아낼 수 있다.다른 방법으로, Max 함수를 사용하면 재할당이 일어나기 전까지 배열에 저장할 수 있는 엘리먼트 최대 개수를 구한다.GetSlack은 Max와 Num의 차이와 같다.
TArray<int32> SlackArray;
// SlackArray.GetSlack() == 0
// SlackArray.Num() == 0
// SlackArray.Max() == 0

SlackArray.Emplace(1)
// SlackArray.GetSlack() == 3
// SlackArray.Num() == 1
// SlackArray.Max() == 4
// 4개의 용량 추가

SlackArray.Emplace(2);
SlackArray.Emplace(3);
SlackArray.Emplace(4);
SlackArray.Emplace(5);
// SlackArray.GetSlack() == 17
// SlackArray.Num() == 5
// SlackArray.Max() == 22
재할당 이후 컨테이너의 슬랙 양은 얼로케이터에 의해 결정되므로, 사용자가 남아있는 슬랙이 일정할 거라 믿어서는 안된다.

슬랙 관리가 필수는 아니지만, 알아 두면 배열 최적화 힌트를 얻는데 도움이 될 수 있다.
예를 들어 배열에 엘리먼트를 100개 쯤 추가해야겠다고 알고 있는 상황에서, 슬랙이 최소 100이상은 되는 것으로 알고 있다면 그냥 추가해도 할당이 새로 일어나지는 않는다.
위에 언급한 Empty 함수는 옵션으로 슬랙 인수를 받는다.

 

SlackArray.Empty();
// SlackArray.GetSlack() == 0
// SlackArray.Num() == 0
// SlackArray.Max() == 0

SlackArray.Empty(3);
// SlackArray.GetSlack() == 3
// SlackArray.Num() == 0
// SlackArray.Max() == 3

SlackArray.Emplace(1);
SlackArray.Emplace(2);
SlackArray.Emplace(3);
// SlackArray.GetSlack() == 0
// SlackArray.Num() == 3
// SlackArray.Max() == 3
Empty와 비슷한 방식으로 작동하는 Reset 함수가 있다.

요청된 슬랙이 현재 할당으로 충분한 경우 메모리를 해제하지 않는다는 차이점이 있음
하지만 요청된 슬랙이 더 크다면, 메모리를 추가로 할당함.

 

SlackArray.Reset(0);
// SlackArray.GetSlack() == 0
// SlackArray.Num() == 0
// SlackArray.Max() == 0
SlackArray.Reset(10);
// SlackArray.GetSlack() == 10
// SlackArray.Num() == 0
// SlackArray.Max() == 10
마지막으로 모든 슬랙은 Shrink 함수로 제거할 수 있다.현재 엘리먼트 저장에 필요한 최소 크기로 할당을 조정Shrink가 배열의 엘리먼트에 어떤 효과를 발휘하지는 않음
SlackArray.Emplace(5);
SlackArray.Emplace(10);
SlackArray.Emplace(15);
SlackArray.Emplace(20);
// SlackArray.GetSlack() == 6
// SlackArray.Num() == 4
// SlackArray.Max() == 10

SlackArray.Shrink();
// SlackArray.GetSlack() == 0
// SlackArray.Num() == 4
// SlackArray.Max() == 4

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

TArray - 힙  (0) 2024.01.07
TArray - 연산자  (0) 2024.01.07
TArray - Remove  (0) 2024.01.07
TArray - FilterByPredicate  (0) 2024.01.07
TArray - IndexOfByPredicate  (0) 2024.01.02