FString과

대부분의 C++ 프로젝트에서 문자열은 텍스트, 식별자 및 기타 데이터 유형에 사용되는 기본 데이터 유형입니다.

그러나 문자열은 자주 사용되거나 많은 양의 데이터를 포함하는 경우 상당한 양의 메모리를 소비할 수 있습니다.

메모리를 보존해야 하는 프로젝트에서는 String 개체의 메모리 사용량을 신중하게 고려하고 최소화하는 것이 중요합니다.

언리얼 엔진에서 FString은 편리함과 엔진의 전체 구조와의 무결성으로 인해 사용하기 쉬운 클래스이지만 특정 상황에서는 대신 std::string을 사용해야 할 수도 있습니다.

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

문자열 클래스의 메모리 내 표현

두 String 클래스에는 용량의 길이와 사용된 문자를 저장하는 내부 변수가 있습니다.

(내부 저장소의 실제 표현은 매장 수를 세는 것보다 복잡하지만 간단한 비교 방법을 사용했습니다.

)


FString과 1
std::string의 내부 변수


FString과 2
FString의 내부 변수

일반적으로 std::string은 FString보다 적은 메모리를 사용합니다.

std::string은 메모리에서 연속 문자 블록을 관리하는 C++ 표준 라이브러리에서 제공하는 단순 문자열 유형입니다.

문자열 길이와 동일한 고정된 양의 메모리를 사용합니다.

FString은 언리얼 엔진의 String 클래스로 현지화 및 텍스트 서식 지원과 같은 다양한 편의 기능을 제공합니다.

하지만 이 추가 기능은 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());

결과:

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

분명히 FString은 std::string보다 두 배 많은 메모리를 소비합니다.

FString은 필요에 따라 크기 조정이 가능한 동적으로 할당된 버퍼에 문자를 저장하기 때문에, FString 오브젝트의 크기는 그 내용물의 크기보다 훨씬 클 수 있습니다.

FStrings는 유니코드 문자도 지원하여 메모리 사용량을 더욱 늘릴 수 있습니다.

메모리 사용량이 문제라면 std::string이 Unreal Engine의 FString보다 더 나은 선택일 수 있습니다.

그러나 FString이 제공하는 추가 기능이 필요한 경우 더 높은 메모리 사용량을 수용할 수 있습니다.

고려 사항:

언리얼 엔진에서 FString 클래스는 지연 초기화, 기록 중 복사 동작, 유니코드 문자 지원과 같은 기능을 제공하며, 이 모든 기능은 메모리 제약 환경에서 String 오브젝트의 메모리 공간을 줄이는 데 도움이 됩니다.

최적화된 문자열 클래스를 사용하는 것 외에도 문자열로 작업할 때 메모리 사용량을 줄이는 데 사용할 수 있는 몇 가지 다른 기술이 있습니다.

여기에는 문자열 풀링을 사용하여 자주 사용되는 문자열에 대한 메모리를 재사용하고, 불필요한 문자열 복사를 피하고, 버퍼 보기를 사용하여 새 문자열 개체를 만들지 않고 더 큰 문자열의 하위 문자열을 참조하는 것이 포함됩니다.

졸업 증서:

문자열 개체 메모리 사용량은 메모리를 절약해야 하는 모든 프로젝트에서 중요한 고려 사항입니다.

문자열 클래스를 신중하게 선택하고 메모리 사용을 최적화하면 메모리가 제한된 환경에서도 프로그램이 원활하고 효율적으로 실행됩니다.

참조: