inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

133

hush park

작성한 질문수 46

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());

}

 

unreal-engine 언리얼-c++

답변 2

0

이득우

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

 

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

0

인프런 AI 인턴

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

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

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

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

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

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

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

저는 저 노란색 미리보기 창이 안뜹니다

0

21

1

강의중에 사용하는 ppt 수업 자료

0

37

1

GetName(), SetName() 함수의 오버로딩 관련 문제 문의드립니다.

0

40

1

언리얼 공부 방법에 대해서 질문드립니다.

0

72

1

컴포지션을 위한 컴포넌트 생성에 관해 질문드립니다.

0

83

2

if (NameProp) 은 if (NameProp != nullptr)이랑 같은 의미인가요?

0

96

2

언리얼 계정 로그인 불가 문제

0

118

2

가비지컬렉션 주기를 짧게 유지하면 어떤 이슈가있을까요?

0

75

2

11강 TArray TSet 에 대해서 질문있습니다.

0

72

1

Unreal 연동 후 Visual Studio 빌드오류 제발 살려주십쇼

0

366

3

언리얼에서 제공하는 스마트 포인터 라이브러리 사용

0

75

2

FGCObject 상속 받은 객체에서 Uobject 삭제를 원할 때

0

80

2

게임 내 인벤토리 데이터를 관리 할 경우, TArray / TSet 무엇이 올바를까요?

0

75

2

8강 컴포지션 중 궁금한 것이 있습니다.

0

56

2

헤더 파일 분리 방법

0

84

2

언리얼 엔진 깃 설치

0

88

2

FObjectInitializer 를 사용한 생성자.

0

96

2

언리얼엔진 에서 새로운 클래스를 생성하면

0

75

2

GetName이 이미있는데용?

0

113

2

TObjectPtr 과 일반 포인터에 대한 용도 질문

0

105

2

UPROPERTY() 다음 라인에서 세미콜론이 입력되지 않습니다.

0

164

1

[18:50] 패키지 저장 시 이미 패키지가 있으면 로딩을 다 하고 저장하는 것이 좋은 이유가 궁금합니다

0

140

2

NonPropStudent가 GC이후 invalid된 이유

0

78

2

[44:22] 커스텀 구조체에서 GetTypeHash() 와 operator== 를 오버로딩 하는 이유에 대한 질문

0

108

2