KoreanFoodie's Study

[언리얼] TTypeCompatibleBytes 타입 본문

Game Dev/Unreal C++ : Study

[언리얼] TTypeCompatibleBytes 타입

GoldGiver 2023. 3. 22. 11:59

TTypeCompatibleBytes 타입

핵심 :

1. TTypeCompatibleBytes 은 기본 타입이 아닌 데이터 배열로, 컴파일 타임 alignment 가 가능하다.
2. Alignment 가 되는 기본 단위는 템플릿 매개변수로 전달된 타입으로부터 계산된 사이즈로 정의된다.
3. GetTypedPtr 로 해당 Element 를 사용할 수 있다.

TypeCompatibleBytes.h 에 정의된 구현을 보면,

/** An untyped array of data with compile-time alignment and size derived from another type. */
template<typename ElementType>
struct TTypeCompatibleBytes :
	public TAlignedBytes<
		sizeof(ElementType),
		alignof(ElementType)
		>
{
	ElementType*		GetTypedPtr()		{ return (ElementType*)this;  }
	const ElementType*	GetTypedPtr() const	{ return (const ElementType*)this; }
};

 

TAlignedBytes 는 다음과 같다 :

/**
 * Used to declare an untyped array of data with compile-time alignment.
 * It needs to use template specialization as the MS_ALIGN and GCC_ALIGN macros require literal parameters.
 */
template<int32 Size,uint32 Alignment>
struct TAlignedBytes; // this intentionally won't compile, we don't support the requested alignment

/** Unaligned storage. */
template<int32 Size>
struct TAlignedBytes<Size,1>
{
	uint8 Pad[Size];
};

 

예제를 보고 마무리하자. 하지만 실제로 TTypeCompatibleBytes 의 멤버 함수를 쓸 일은 거의 없을 것이다. 엔진 소스를 보면, Delegate 타입을 검사하는데 GetTypedPtr 를 사용하고 있다.

TOptional<TTypeCompatibleBytes<FMpRewardCurrency>> currencyOptions;
auto element = currencyOptions.GetValue().GetTypedPtr();

또한 TOptional 에서 GetValue() 를 쓸 일도 거의 없다. '->' 가 내부적으로 GetValue() 를 호출하도록 오버로딩되어 있기 때문이다.

 

참고 : 언리얼 공식 문서
Comments