C ++ 14는 std::dynarray
다음을 제공합니다 .
std :: dynarray는 구성시 고정되고 객체의 수명 동안 변경되지 않는 크기로 배열을 캡슐화하는 시퀀스 컨테이너입니다.
std::dynarray
와 동일하게 런타임에 할당되어야합니다 std::vector
.
그렇다면 더 동적 인 (또한 크기를 std::dynarray
조정할 수있는) 사용할 수 있는 동안 의 이점과 사용법은 std::vector
무엇입니까?
C ++ 14는 std::dynarray
다음을 제공합니다 .
std :: dynarray는 구성시 고정되고 객체의 수명 동안 변경되지 않는 크기로 배열을 캡슐화하는 시퀀스 컨테이너입니다.
std::dynarray
와 동일하게 런타임에 할당되어야합니다 std::vector
.
그렇다면 더 동적 인 (또한 크기를 std::dynarray
조정할 수있는) 사용할 수 있는 동안 의 이점과 사용법은 std::vector
무엇입니까?
std::valarray
로 이름이 변경 std::dynarray
? std::dynarray
크기를 조정할 수없는 경우 어떤 점이 동적 입니까?
valarray
. 배열의 길이는 런타임 값이 때문에의 역동적 인, 그것은 달리 컴파일 타임에 할 필요가 없습니다std::array
dynarray
에서 C ++ 14에서 제거되었으며 심각한 기술 문제가 있기 때문에 향후 기술 사양 (TR1의 새 버전이라고 생각)에 포함되었습니다.
답변:
그렇다면 더 동적 인 (크기 조정 가능)을
std::dynarray
사용할 수있을 때 의 이점과 사용법은std::vector
무엇입니까?
dynarray
vector
별도의 크기 및 용량 값을 관리 할 필요가없고 할당자를 저장할 필요가 없기 때문에 보다 작고 간단 합니다.
그러나 주요 성능 이점은 구현이 dynarray
가능한 경우 스택 에 할당 하여 힙 할당을 피할 수 있다는 사실에서 비롯됩니다 . 예
std::dynarray<int> d(5); // can use stack memory for elements
auto p = new std::dynarray<int>(6); // must use heap memory for elements
이 최적화는 컴파일러의 협력을 필요로하며, 순수한 라이브러리 유형으로 구현할 수 없으며 필요한 컴파일러 마법이 구현되지 않았으며 그 작업이 얼마나 쉬운 지 아무도 모릅니다. 구현 경험이 부족하기 때문에 지난주 시카고에서 열린 C ++위원회 회의 std::dynarray
에서 C ++ 14에서 가져 와서 별도의 배열 확장 TS (기술 사양) 문서 정의 std::experimental::dynarray
및 런타임 바인딩 배열 (ARB, 유사 )을 발행 하기로 결정했습니다. C99 VLA에.) 이것은 std::dynarray
거의 확실하게 C ++ 14에 없다는 것을 의미 합니다.
dynarray
야생있다. 나는 항상 어떤 것이 표준화 대상이되기 전에 기존 관행의 두 가지 독립적 인 구현이 필요하다고 생각했습니다.
dynarray
. 구현 경험은 매우 유용하지만, 거기를 필요로 정해진 규칙이 없다 (그러나 일부는이 있어야 말할 것!)
당신이 말했듯 std::dynarray
이, 고정 크기 동적 배열입니다. 크기를 조정할 수 없습니다. 대략적으로 계속해서 개선 new T[N]
되고 std::unique_ptr<T[]>(new T[N])
있습니다.
용량의 크기를 조정하거나 관리 할 필요가 없다는 것은 덜 복잡하고 적은 공간에서 데이터 구조를 구현할 수 있음을 의미합니다.
더욱이, std::dynarray
구현이 다른 비 특정 방식으로 구현할 수있게 해주는 이상한 동물입니다. 예를 들어 스택에 배열을 배치 할 수 있습니다. 할당 함수 호출은 "선택 사항"입니다. 할당자를 지정하여 배열의 요소를 구성 할 수 있지만 이는 유형의 일부가 아닙니다.
우리가 왜 필요 당신은 또한 궁금 할 것이다 std::dynarray
및 가변 길이 배열. C ++ 14의 VLA는 훨씬 더 제한적입니다. 로컬 자동 변수 일 수 있으며 할당 정책을 지정할 수있는 방법을 제공하지 않으며 표준 컨테이너 인터페이스가 없습니다.
"현재 초안"23.3.4.2의 몇 가지 예 (Google 캐시) :
explicit dynarray(size_type c);
효과 :
c
요소에 대한 저장 공간을 할당 합니다. global을 호출하거나 호출하지 않을 수 있습니다operator new
.
template <class Alloc> dynarray(size_type c, const Alloc& alloc);
효과 : 각 요소가 uses-allocator 생성으로 생성된다는 점을 제외하면 앞의 생성자와 동일합니다 .
주어진 할당자를 사용하여 배열 요소를 구성 할 수 있는지 여부 는 전역 특성입니다.
템플릿 구조체 uses_allocator, Alloc> : true_type {};
요구 사항 :
Alloc
할당 자 (17.6.3.5) 여야합니다. [ 참고 : 이 특성의 전문화dynarray
는 중첩 된 allocator_type이 없더라도 할당 자로 구성 할 수있는 다른 라이브러리 구성 요소를 알려줍니다 .]
편집 : Jonathan Wakely의 답변은 훨씬 더 권위 있고 통찰력이 있습니다.
dynarray
의 생성자에 할당자를 전달하는 것은 할당에 사용되지 않으며 요소의 생성자에 대한 인수로만 사용됩니다 ( "uses-allocator 생성"사용). 이것이 할당자가 사용되었는지 여부를 쿼리 할 수없는 이유입니다.