std :: dynarray 대 std :: vector


84

C ++ 14는 std::dynarray다음을 제공합니다 .

std :: dynarray는 구성시 고정되고 객체의 수명 동안 변경되지 않는 크기로 배열을 캡슐화하는 시퀀스 컨테이너입니다.

std::dynarray와 동일하게 런타임에 할당되어야합니다 std::vector.

그렇다면 더 동적 인 (또한 크기를 std::dynarray조정할 수있는) 사용할 수 있는 동안 의 이점과 사용법은 std::vector무엇입니까?


1
"C ++ 14"는 언제부터 태그입니까? 나는 다른 일이하고 ... 존재하지 않는 것을 찾고 있었다
— Kerrek SB

1
인가 std::valarray로 이름이 변경 std::dynarray? std::dynarray크기를 조정할 수없는 경우 어떤 점이 동적 입니까?
— yasouser

9
@yasouser, 아니요, valarray. 배열의 길이는 런타임 값이 때문에의 역동적 인, 그것은 달리 컴파일 타임에 할 필요가 없습니다std::array
— 조나단 Wakely

21
지난주 C ++ 표준위원회 회의 dynarray에서 C ++ 14에서 제거되었으며 심각한 기술 문제가 있기 때문에 향후 기술 사양 (TR1의 새 버전이라고 생각)에 포함되었습니다.
— Pete Becker

2
dynarray 는 더 이상 C ++ 14 초안의 일부가 아닙니다
— cassinaj

답변:


90

그렇다면 더 동적 인 (크기 조정 가능)을 std::dynarray사용할 수있을 때 의 이점과 사용법은 std::vector무엇입니까?

dynarrayvector별도의 크기 및 용량 값을 관리 할 필요가없고 할당자를 저장할 필요가 없기 때문에 보다 작고 간단 합니다.

그러나 주요 성능 이점은 구현이 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에 없다는 것을 의미 합니다.


1
이 있다면 우수함, 궁금 해서요 어떤 아닌 사소한 구현 dynarray야생있다. 나는 항상 어떤 것이 표준화 대상이되기 전에 기존 관행의 두 가지 독립적 인 구현이 필요하다고 생각했습니다.
— Kerrek SB

아니요, 스택 할당의 알려진 구현은 없습니다 dynarray. 구현 경험은 매우 유용하지만, 거기를 필요로 정해진 규칙이 없다 (그러나 일부는이 있어야 말할 것!)
— 조나단 Wakely

여기서 브레인 스토밍을했지만 std :: dynarray make_dyn_autostorage (int) 및 std :: dynarray make_dyn_heap (int)의 두 가지 함수를 만드는 것은 어떻습니까?
— Laurijssen

2
@KerrekSB, 예, 시카고의 라이브러리 모션 10은 다음과 같습니다. "이동하여 계획된 Array Extensions TS에 대한 작업 문서를 만들고, N3639 두 문서에 의해 C ++ 14 CD에 적용된 편집 내용을 제거하십시오 ."자동으로 런타임 크기의 어레이 storage duration (revision 5) " N3662 ,"C ++ Dynamic Arrays (dynarray) "를 선택하고 Array Extensions TS 프로젝트 편집기가 해당 단어를 Array Extensions Working Paper에 초기 콘텐츠로 적용하도록 지시합니다."
— Jonathan Wakely

3
@ h9uest는 "the C ++ guys"와 관련이 없습니다. 이들은 ISO 기술위원회 의 결과물에 대한 공식 이름입니다. iso.org/iso/home/standards_development/… 및 iso.org/iso/home/standards_development를
— 조나단 Wakely

31

당신이 말했듯 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 생성"사용). 이것이 할당자가 사용되었는지 여부를 쿼리 할 수없는 이유입니다.
— Jonathan Wakely

@JonathanWakely : 아, 오해했습니다. 감사합니다.
— Kerrek SB
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.