2016-09-30 3 views
17

C++ 17은 메모리 할당 및 할당 해제를위한 깨끗한 인터페이스 인 std::pmr::memory_resource을 가져올 것입니다. Allocator 개념과 달리 은 단지 이상입니다. std::pmr::polymorphic_allocator도 메모리 리소스를 고전적인 할당 자로 래핑하여 기존 컨테이너와 함께 사용할 수 있습니다.새로운 C++ 코드는 할당 자 대신 메모리 리소스를 사용해야합니까?

나는 새 컨테이너 대해 쓸거야 경우 (또는 다른 메모리 사용량이) 나는 할당 자 개념에 대한 프로그램을 계속하거나 오히려 직접 새롭고 깨끗한 추상화를 사용한다, 나중에 C++ 17을 목표로 입력?

지금 내 생각은 이렇게됩니다.

이유는 할당자를 사용하여 계속 :

  • 그것은 표준 라이브러리와 기존 코드와 일치한다. 새로운 std::pmr::* 컨테이너 별칭조차 할당자를 계속 사용합니다. 메모리 자원이 std::pmr::polymorphic_allocator로 래핑 할 수 있으므로
  • 는 할당 인터페이스는 더 일반적이며 많은 고객의 요구를 만족시킨다. 그들이 할당 자이 제공 할 수있는 제로 오버 헤드 추상화에 비해 약간의 추가 런타임 오버 헤드가 있으므로
  • 메모리 자원은 항상 런타임 다형성을 사용합니다.
  • 아마도 누군가 순수 메모리 리소스에서 제공 할 수없는 할당 자 인터페이스 (예 : 사용자 정의 포인터 유형)의 다른 부분을 필요로 할 수도 있습니다.

이유는 할당 자 대신 메모리 리소스를 사용하려면 :

  • 할당자는 인터페이스는 어설픈 구현하기 어렵다. std::pmr::memory_resource 인터페이스는 깨끗하고 간단합니다. 메모리 자원 다형성 때문에
  • , 그들은 적은 템플릿 인스턴스화 (그리고 어쩌면 더 빠른 컴파일과 작은 실행 파일)을 의미하고 별도의 번역 단위로 더 많은 코드를 이동하는 우리를있게 용기의 종류에 영향을 미치지 않습니다.
  • 목적은 메모리 자원을 사용하는 경우 항상 여전히 std::pmr::polymorphic_allocator으로 메모리 자원 배치에 의해 할당자를 사용하는 서브 - 객체를 인스턴스화 할 수있다. 다른 방법은 더 어렵습니다.
  • 어쨌든 메모리 할당은 상대적으로 작업 집약적 인 작업입니다. 단일 가상 함수 호출은 상대적으로 많은 오버 헤드를 추가하지 않습니다.

이 수행 이미 효과적으로 새로운 라이브러리 기능을 사용하는 방법에 대한 권장 사항을 존재 하는가?

+1

할당 자 인터페이스는 실제로 구현하기가 어렵지 않습니다. C++ 11은 훨씬 더 간단하게 만들었습니다. 두 가지 유형 이름, 두 개의 함수 및 두 개의 비교가 필요합니다. –

+1

메모리 할당이 상대적으로 집중적인지 여부는 할당 자에 따라 다르지 않습니까? 로컬 스택의 단조로운 아레나에서 할당하는 경우 비용이 많이 들지 않고 아주 안락 할 수도 있습니다. –

+0

@KerrekSB 사실입니다. 사실, C++ 11에서 제공하는 어댑터 없이는 구현하지 않았습니다. 아직도, 내가 우아하다고 생각하는 것은 아니다. – 5gon12eder

답변

8

이 시점에서. C++에서

소산은 현재 그들이 예전보다 훨씬 쉽다.

그들은 pmr 및 고전적인 할당 자 지원을 제공합니다.

더 중요한 것은 pmr 기반 할당은 수년 동안 많이 사용되지 않았 음을 의미합니다. 어떤 약점도 여전히 밝혀 질 수 있습니다.

빠른 풀 기반 할당 자 또는 심지어 고정 버퍼 수 또는 sbo 확장은 가상화 오버 헤드를 감지 할 수 있습니다.

+2

나는 일반적으로 동의하는이 답변을 주셔서 감사합니다. 그러나 나는 다른 사람들이 다른 말을 할 수있는 경우를 대비하여 대답을 받기 전에 며칠을 기다리는 것을 좋아한다. "PMR"= "다형성 메모리 리소스"및 "SBO"= "작은 버퍼 최적화"라고 생각합니다. – 5gon12eder