인프런 커뮤니티 질문&답변

hush park님의 프로필 이미지
hush park

작성한 질문수

이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해

10강 언리얼 컨테이너 라이브러리 I - Array와 Set

TSet<FString> FruitSet; 관련 궁금증입니다.

해결된 질문

작성

·

57

·

수정됨

0

TSet<FString> FruitSet; 로 아무런 요소를 할당하지 않고 만들었을때, 초기 메모리 할당크기는 0 바이트인지 16바이트인지 궁금합니다.

 

TSet<FString> FruitSet;

UE_LOG(LogTemp, Warning, TEXT("FruitSet's size : %d"), FruitSet2.GetAllocatedSize());

라는 구문을 실행했을 때, 저는 0바이트로 기대했는데 결과가 16바이트로 나옵니다. 단지 선언만 했을 뿐인데도 16바이트가 자동으로 할당되는것처럼 생각되는데, 이것은 참인가요?


 

 

(테스트 코드)

// Fill out your copyright notice in the Description page of Project Settings.

#include "GameInstance/MyGameInstance.h"

#include "Algo/Accumulate.h"

void UMyGameInstance::Init()

{

Super::Init();

FString Comb;

TSet<FString> FruitSet2;

UE_LOG(LogTemp, Warning, TEXT("FruitSet2's size : %d"), FruitSet2.GetAllocatedSize());

//

FruitSet2.Reserve(10);

UE_LOG(LogTemp, Warning, TEXT("FruitSet2's size : %d"), FruitSet2.GetAllocatedSize());

//

FruitSet2 = { "Kiwi", "Melon", "Orange" };

UE_LOG(LogTemp, Warning, TEXT("FruitSet2's size : %d"), FruitSet2.GetAllocatedSize());

 

// 결과 출력

Comb = FString::Join(FruitSet2, TEXT(", "));

UE_LOG(LogTemp, Warning, TEXT("FruitSet2(Sorted) : %s"), *Comb);

 

//

FruitSet2.Empty();

UE_LOG(LogTemp, Warning, TEXT("FruitSet2's size : %d"), FruitSet2.GetAllocatedSize());

}

 

답변 2

0

이득우님의 프로필 이미지
이득우
지식공유자

자료구조의 경우 성능과 효율성을 위해 데이터가 없더라도 미리 저장공간을 확보해두는 경우가 종종 있습니다. 이 경우도 Hash 테이블의 설계로 인해 초기에 메모리가 설정된 것 같습니다.
해당 함수의 소스 코드는 다음과 같이 구성되어 있는데, 요소의 총 메모리크기와 해시 테이블 대한 크기를 합산해 돌려주는 것을 확인할 수 있습니다.

 

FORCEINLINE SIZE_T GetAllocatedSize( void ) const
{
	return Elements.GetAllocatedSize() + Hash.GetAllocatedSize(HashSize, sizeof(FSetElementId));
}

0

안녕하세요, 인프런 AI 인턴입니다. hush park님.

언리얼 엔진에서의 TSet 기초 메모리 할당 관련 궁금증에 대해 설명드리겠습니다. TSet<FString>는 언리얼의 자료구조 중 하나로, 내부적으로는 해시 테이블로 구현되어 있습니다. 해시 테이블 특성상, 비어 있더라도 초기화 과정에서 약간의 메모리가 할당됩니다. 이것이 바로 16바이트로 나타나는 이유입니다.

기본적으로 언리얼 엔진의 TSet과 같은 컬렉션 클래스들은 요소를 추가할 때마다 리사이징이 발생하지 않도록 최소한의 메모리를 미리 할당하고 시작합니다. 이러한 메모리 할당은 다양한 이유로 유용합니다. 예를 들어, 아주 빈번한 추가와 삭제 작업을 고려할 때 성능에 긍정적인 영향을 줄 수 있습니다.

이전 질문과 답변에서 비슷한 내용을 참고하실 수 있습니다:
- TSet과 메모리 관리에 대한 이해

본 링크에서는 메모리 관리 방식과 최적화에 대한 토론이 이루어졌습니다. 메모리 관리에 대한 추가적인 세부 설명이 되어 있습니다.

결론적으로, TSet<FString> FruitSet;를 선언하면 초기 설정 자체가 약간의 메모리를 요구하면서 시작되므로 0바이트가 아닌 16바이트의 메모리가 할당되는 것이 정상적인 동작입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hush park님의 프로필 이미지
hush park

작성한 질문수

질문하기