반응형
대부분의 C++ 프로젝트에서 문자열은 텍스트, 식별자 및 기타 데이터 유형에 사용되는 기본 데이터 유형입니다.
그러나 문자열은 자주 사용되거나 많은 양의 데이터를 포함하는 경우 상당한 양의 메모리를 소비할 수 있습니다. 메모리를 절약해야 하는 프로젝트에서는 문자열 개체의 메모리 사용량을 신중하게 고려하고 최소화하는 것이 중요합니다.
언리얼 엔진에서 FString은 기능의 편리함과 엔진의 전체 구조와의 무결성으로 인해 사용하기 쉬운 클래스이지만 특정 상황에서는 std::string을 대신 사용해야 할 경우도 있습니다.
문자열 클래스의 메모리 사용량 확인
// 13 characters
std::string MyStdString = "Hello, world!";
FString MyFString = "Hello, world!";
UE_LOG(LogTemp, Log, TEXT("allocated size[std::string] = %d"), MyStdString.capacity());
UE_LOG(LogTemp, Log, TEXT("allocated size[FString] = %d"), MyFString.GetAllocatedSize());
결과:
LogTemp: allocated size[std::string] = 15
LogTemp: allocated size[FString] = 28
문자열 클래스의 내부 메모리 표현
두 문자열 클래스에는 용량 길이와 사용된 문자를 저장하는 내부 변수가 있습니다. (실제 내부 메모리 표현은 스토리지 수를 세는 것보다 더 복잡하지만 비교를 위해 간단한 방법을 사용했습니다.)
일반적으로 std::string은 FString보다 적은 메모리를 사용합니다.
std::string은 메모리에서 연속적인 문자 블록을 관리하는 C++ 표준 라이브러리에서 제공하는 단순 문자열 유형입니다. 문자열 길이에 해당하는 고정된 양의 메모리를 사용합니다.
FString은 현지화 및 텍스트 형식 지원과 같은 다양한 편의 기능을 제공하는 Unreal Engine의 문자열 클래스입니다. 그러나 이 추가 기능은 FString이 그 기능을 처리하기 위해 복잡한 메모리 관리 체계를 사용하기 때문에 메모리 사용 측면에서 비용이 듭니다.
긴 문자열(100자 정도)인 경우는?
// 100 characters
std::string MyStdString = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
FString MyFString = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
UE_LOG(LogTemp, Log, TEXT("allocated size[std::string] = %d"), MyStdString.capacity());
UE_LOG(LogTemp, Log, TEXT("allocated size[FString] = %d"), MyFString.GetAllocatedSize());
결과:
LogTemp: allocated size[std::string] = 111
LogTemp: allocated size[FString] = 202
확실히 FString은 std::string보다 2배 더 많은 메모리를 사용합니다.
FString은 필요에 따라 크기 조정이 가능한 동적으로 할당된 버퍼에 문자를 저장하기 때문에, FString의 크기는 문자열 메모리의 크기보다 훨씬 클 수 있습니다. 또한 FStrings는 유니코드 문자를 지원하여 메모리 사용량을 더욱 늘릴 수 있습니다.
메모리 사용량이 걱정된다면 언리얼 엔진의 FString보다 std::string이 더 나은 선택일 수 있습니다. 그러나 FString이 제공하는 추가 기능이 필요한 경우 더 높은 메모리 사용량을 감수해야 할 수도 있습니다.
고려 사항:
언리얼 엔진에서 FString 클래스는 lazy initialization, copy-on-write 동작, 유니코드 문자 지원과 같은 기능을 제공하며, 이 모든 기능은 메모리 제약 환경에서 문자열 오브젝트의 메모리 공간을 줄이는 데 도움이 됩니다.
최적화된 문자열 클래스를 사용하는 것 외에도 문자열로 작업할 때 메모리 사용량을 줄이는 데 사용할 수 있는 몇 가지 다른 기술이 있습니다. 여기에는 String Pooling을 사용하여 자주 사용되는 문자열에 대한 메모리를 재사용하고, 불필요한 문자열 복사본을 피하고, Buffer View를 사용하여 새 문자열 개체를 만들지 않고 더 큰 문자열의 하위 문자열을 참조하는 것이 포함됩니다.
결론:
문자열 개체의 메모리 사용량은 메모리를 절약해야 하는 모든 프로젝트에서 중요한 고려 사항입니다. 문자열 클래스를 신중하게 선택하고 메모리 사용을 최적화하면 메모리가 제한된 환경에서도 프로그램이 원활하고 효율적으로 실행될 수 있습니다.
참고 자료:
반응형
'Unreal Engine' 카테고리의 다른 글
여러 객체를 대상으로 카메라 전환하는 방법 (Unreal Engine, C++) (0) | 2023.04.22 |
---|---|
두께를 가진 Polyline을 Procedural Mesh로 생성하는 방법 (Unreal Engine, C++) (0) | 2023.04.01 |
DrawDebugLine()의 런타임 성능 (Unreal Engine, C++) (0) | 2023.03.22 |
Unreal Engine(C++)에서 Material을 로드하는 방법 (0) | 2023.03.15 |
정다각형(N-gon)을 Procedural Mesh로 생성하는 방법 (Unreal Engine, C++) (0) | 2023.03.14 |