기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS SDK for C++의 메모리 관리
AWS SDK for C++는 라이브러리에서 메모리 할당 및 할당 해제를 제어하는 방법을 제공합니다.
참고
사용자 지정 메모리 관리는 정의된 컴파일 시간 상수 USE_AWS_MEMORY_MANAGEMENT를 사용하여 빌드된 라이브러리 버전을 사용하는 경우에만 사용할 수 있습니다.
컴파일 시간 상수 없이 빌드된 라이브러리 버전을 사용하는 경우에는 InitializeAWSMemorySystem과 같은 글로벌 메모리 시스템 함수가 작동하지 않으며, 대신 글로벌 new 및 delete 함수가 사용됩니다.
컴파일 시간 상수에 대한 자세한 내용은 STL 및 AWS 문자열과 벡터를 참조하세요.
메모리 할당 및 할당 해제
메모리를 할당하거나 할당 해제하려면
-
하위 클래스
MemorySystemInterface:aws/core/utils/memory/MemorySystemInterface.h.class MyMemoryManager : public Aws::Utils::Memory::MemorySystemInterface { public: // ... virtual void* AllocateMemory( std::size_t blockSize, std::size_t alignment, const char *allocationTag = nullptr) override; virtual void FreeMemory(void* memoryPtr) override; };참고
필요에 따라
AllocateMemory에 대한 유형 서명을 변경할 수 있습니다. -
Aws::SDKOptions구조체를 사용하여 사용자 지정 메모리 관리자 사용을 구성합니다. 구조체의 인스턴스를Aws::InitAPI로 전달합니다. 애플리케이션을 종료하기 전에 동일한 인스턴스로Aws::ShutdownAPI를 호출하여 SDK를 종료해야 합니다.int main(void) { MyMemoryManager sdkMemoryManager; SDKOptions options; options.memoryManagementOptions.memoryManager = &sdkMemoryManager; Aws::InitAPI(options); // ... do stuff Aws::ShutdownAPI(options); return 0; }
STL 및 AWS 문자열과 벡터
메모리 관리자로 초기화되면 AWS SDK for C++는 모든 할당 및 할당 해제를 메모리 관리자에게 위임합니다. 메모리 관리자가 없는 경우 SDK는 글로벌 new 및 delete를 사용합니다.
사용자 지정 STL 할당기를 사용하는 경우 할당 정책과 일치하도록 모든 STL 객체의 유형 서명을 변경해야 합니다. SDK 구현 및 인터페이스에서는 STL이 주로 사용되므로, SDK 내에서 단일 접근 방식을 채택할 경우 기본 STL 객체를 SDK로 직접 전달하거나 STL 할당을 제어하는 것이 제한될 수 있습니다. 대안으로, 내부적으로는 사용자 지정 할당기를 사용하고 인터페이스에서는 표준 및 사용자 지정 STL 객체를 허용하는 하이브리드 접근 방식은 메모리 문제 조사에 더 어려움을 초래할 수 있습니다.
해결 방법은 메모리 시스템의 컴파일 시간 상수 USE_AWS_MEMORY_MANAGEMENT를 사용하여 SDK에서 사용하는 STL 유형을 제어하는 것입니다.
컴파일 시간 상수가 활성화(켜짐)된 경우, 해당 유형은 사용자 정의 할당기가 AWS 메모리 시스템에 연결된 STL 유형으로 확인됩니다.
컴파일 시간 상수가 비활성화(꺼짐)된 경우 모든 Aws::* 유형은 해당하는 기본 std::* 유형으로 확인됩니다.
SDK의 AWSAllocator.h 파일에서 가져온 코드 예제
#ifdef USE_AWS_MEMORY_MANAGEMENT template< typename T > class AwsAllocator : public std::allocator< T > { ... definition of allocator that uses AWS memory system }; #else template< typename T > using Allocator = std::allocator<T>; #endif
예제 코드에서 AwsAllocator는 컴파일 시간 상수에 따라 사용자 지정 할당기 또는 기본 할당기일 수 있습니다.
SDK의 AWSVector.h 파일에서 가져온 코드 예제
template<typename T> using Vector = std::vector<T, Aws::Allocator<T>>;
예제 코드에서는 Aws::* 유형을 정의합니다.
컴파일 시간 상수가 활성화(켜짐)된 경우 유형은 사용자 지정 메모리 할당 및 AWS 메모리 시스템을 사용하여 벡터에 매핑됩니다.
컴파일 시간 상수가 비활성화(꺼짐)된 경우 유형은 기본 유형 파라미터를 사용하는 일반 std::vector에 매핑됩니다.
유형 별칭 지정은 컨테이너, 문자열 스트림, 문자열 버퍼 등 메모리 할당을 수행하는 SDK의 모든 std:: 유형에 사용됩니다. AWS SDK for C++에서는 이러한 유형을 사용합니다.
남아 있는 문제
메모리 할당은 SDK에서 제어할 수 있지만, STL 유형은 여전히 모델 객체 initialize 및 set 메서드에 대한 문자열 파라미터를 통해 퍼블릭 인터페이스의 주요 비중을 차지합니다. STL을 사용하지 않고 문자열과 컨테이너를 대신 사용한다면 서비스 호출을 수행할 때마다 많은 임시 객체를 생성해야 합니다.
STL이 아닌 방식으로 서비스 호출을 수행할 때 발생하는 임시 객체와 할당을 대부분 제거하기 위해 다음과 같이 구현했습니다.
-
문자열을 사용하는 모든 Init/Set 함수에는
const char*를 사용하는 오버로드가 있습니다. -
컨테이너(맵/벡터)를 사용하는 모든 Init/Set 함수에는 단일 항목을 사용하는 add 변형이 있습니다.
-
바이너리 데이터를 사용하는 모든 Init/Set 함수에는 데이터 포인터와
length값을 사용하는 오버로드가 있습니다. -
(선택 사항) 문자열을 사용하는 모든 Init/Set 함수에는 0 종단이 아닌
const char*및length값을 사용하는 오버로드가 있습니다.
네이티브 SDK 개발자 및 메모리 제어
SDK 코드에서는 다음 규칙을 따릅니다.
-
new및delete를 대신해서Aws::New<>및Aws::Delete<>를 사용합니다. -
new[]및delete[]를 대신해서Aws::NewArray<>및Aws::DeleteArray<>를 사용합니다. -
std::make_shared을 대신해서Aws::MakeShared를 사용합니다. -
단일 객체에 대한 고유 포인터에
Aws::UniquePtr을 사용합니다. 고유 포인터를 생성하려면Aws::MakeUnique함수를 사용합니다. -
객체 배열에 대한 고유 포인터에
Aws::UniqueArray를 사용합니다. 고유 포인터를 생성하려면Aws::MakeUniqueArray함수를 사용합니다. -
STL 컨테이너를 직접 사용하지 말고,
Aws::typedef 중 하나를 사용하거나 원하는 컨테이너에 대한 typedef를 추가합니다. 예:Aws::Map<Aws::String, Aws::String> m_kvPairs; -
SDK로 전달되어 관리되는 모든 외부 포인터에
shared_ptr을 사용합니다. 객체 할당 방식과 일치하는 폐기 정책으로 공유 포인터를 초기화해야 합니다. SDK가 포인터를 정리하지 않을 것으로 예상되는 경우 원시 포인터를 사용할 수 있습니다.