해결된 질문
작성
·
445
·
수정됨
0
FName의 경우 전역 풀에 key값으로 저장된다고 하셨습니다.
그렇다면,
예를 들어 함수로 FName타입의 InFName을 받아와서 새로운 FName에 할당을 한다고 한다면,
FName temp = InFName; 을 수행하면 알아서 키 값만 복사 저장이 되나요?
아니면 const FName& temp = InFName; 이런 식으로 저장하여 복사 연산이 일어나지 않도록 하는 것이 좋나요?
함수의 파라미터로 FName 값을 받을 때나,
(ex)
void Func(FName InFName);
or
void Func(const FName& InFName);
클래스 속성에 FName을 할당하고 싶을때
(ex)
class ~~
{
// FName은 전역 풀에서 관리가 되니 따로 복사해서 들고 있을 필요가 없을 것 같다?
FName* temp;
}
or
class ~~
{
FName temp;
}
어떻게 해야하는지 궁금한데 엔진 코드에서 할당 연산자 오버로딩을 못 찾겠어서 질문드립니다.
답변 1
1
프로젝트에서 사용하는 모든 FName 데이터는 엔진이 지정한 전역 풀에서 관리됩니다.
그렇기에 FName는 내부적으로는 문자열이 아닌 인덱스 값(uint32)을 관리하며, 필요시 전처리기에 따라 추가 정보를 가집니다. FName 생성에 사용하는 문자열 정보는 결국 전역 풀의 인덱스 값을 찾아 보관하기 위한 용도일 뿐, 그렇다고 전역 풀의 인덱스를 직접 관리하는 것은 FName의 동작 메커니즘이 복잡해서 좋은 작업으로 생각되진 않습니다.
먼저 질문 주신 부분은 사실 FName을 떠나서 복사와 레퍼런스에 대한 내용인데, C++은 특별한 이유가 없으면 복사는 피하는게 효율적입니다. 하지만 레퍼런스를 고집하기에 FName이 관리하는 데이터가 작아서 의미는 없을 것 같아요.
FName 클래스를 uint32로 생각하시고 어떻게 사용하는게 효과적일지 생각하시면 될 것 같습니다.
굳이 작은 데이터를 포인터를 사용하면서까지 아껴서 설정할 필요는 없어보입니다.
일반적으로 작은 타입인 int32는 굳이 포인터를 쓰지 않고 복사를 해도 된다고 생각합니다. FName도 비슷한 크기라면, 복사를 해주어도 괜찮겠다는 생각이 듭니다. 감사합니다. 많은 도움이 되었습니다.