대부분의 C++ 프로젝트에서 문자열은 텍스트, 식별자 및 기타 데이터 유형에 사용되는 기본 데이터 유형입니다.
그러나 문자열은 자주 사용되거나 많은 양의 데이터를 포함하는 경우 상당한 양의 메모리를 소비할 수 있습니다.
메모리를 보존해야 하는 프로젝트에서는 String 개체의 메모리 사용량을 신중하게 고려하고 최소화하는 것이 중요합니다.
메모리를 보존해야 하는 프로젝트에서는 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 클래스에는 용량의 길이와 사용된 문자를 저장하는 내부 변수가 있습니다.
(내부 저장소의 실제 표현은 매장 수를 세는 것보다 복잡하지만 간단한 비교 방법을 사용했습니다.
)
(내부 저장소의 실제 표현은 매장 수를 세는 것보다 복잡하지만 간단한 비교 방법을 사용했습니다.
)
일반적으로 std::string은 FString보다 적은 메모리를 사용합니다.
std::string은 메모리에서 연속 문자 블록을 관리하는 C++ 표준 라이브러리에서 제공하는 단순 문자열 유형입니다.
문자열 길이와 동일한 고정된 양의 메모리를 사용합니다.
문자열 길이와 동일한 고정된 양의 메모리를 사용합니다.
FString은 언리얼 엔진의 String 클래스로 현지화 및 텍스트 서식 지원과 같은 다양한 편의 기능을 제공합니다.
하지만 이 추가 기능은 FString이 복잡한 메모리 관리 체계를 사용하여 처리하므로 메모리 사용 측면에서 비용이 듭니다.
하지만 이 추가 기능은 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는 유니코드 문자도 지원하여 메모리 사용량을 더욱 늘릴 수 있습니다.
FStrings는 유니코드 문자도 지원하여 메모리 사용량을 더욱 늘릴 수 있습니다.
메모리 사용량이 문제라면 std::string이 Unreal Engine의 FString보다 더 나은 선택일 수 있습니다.
그러나 FString이 제공하는 추가 기능이 필요한 경우 더 높은 메모리 사용량을 수용할 수 있습니다.
그러나 FString이 제공하는 추가 기능이 필요한 경우 더 높은 메모리 사용량을 수용할 수 있습니다.
고려 사항:
언리얼 엔진에서 FString 클래스는 지연 초기화, 기록 중 복사 동작, 유니코드 문자 지원과 같은 기능을 제공하며, 이 모든 기능은 메모리 제약 환경에서 String 오브젝트의 메모리 공간을 줄이는 데 도움이 됩니다.
최적화된 문자열 클래스를 사용하는 것 외에도 문자열로 작업할 때 메모리 사용량을 줄이는 데 사용할 수 있는 몇 가지 다른 기술이 있습니다.
여기에는 문자열 풀링을 사용하여 자주 사용되는 문자열에 대한 메모리를 재사용하고, 불필요한 문자열 복사를 피하고, 버퍼 보기를 사용하여 새 문자열 개체를 만들지 않고 더 큰 문자열의 하위 문자열을 참조하는 것이 포함됩니다.
여기에는 문자열 풀링을 사용하여 자주 사용되는 문자열에 대한 메모리를 재사용하고, 불필요한 문자열 복사를 피하고, 버퍼 보기를 사용하여 새 문자열 개체를 만들지 않고 더 큰 문자열의 하위 문자열을 참조하는 것이 포함됩니다.
졸업 증서:
문자열 개체 메모리 사용량은 메모리를 절약해야 하는 모든 프로젝트에서 중요한 고려 사항입니다.
문자열 클래스를 신중하게 선택하고 메모리 사용을 최적화하면 메모리가 제한된 환경에서도 프로그램이 원활하고 효율적으로 실행됩니다.
문자열 클래스를 신중하게 선택하고 메모리 사용을 최적화하면 메모리가 제한된 환경에서도 프로그램이 원활하고 효율적으로 실행됩니다.
참조: