2014-09-17 4 views
-2

C++에서 STL vector는 동적 배열이지만 스택과 같은 연산을 수행합니다. 그래서 어느 누구도 데이터가 스택 또는 힙 세그먼트에 저장되는지 여부를 알 수 있습니다.C++ : 벡터 표준 템플릿 라이브러리

+0

당신이 말한 것처럼 역동적 인 배열은 힙에서 가정합니다. – 101010

+4

* 모든 * 메모리는 스택으로 작동 할 수 있습니다. 요소 추가 및 제거의 문제 일뿐입니다. –

+0

"스택과 같은 연산을 수행함"이란 무엇을 의미합니까? 스택에 정의 된 스택 또는 스택 구조를 의미합니다. –

답변

0

힙의 인접 블록에 요소가 저장됩니다. 로컬로 생성하거나 동적으로 할당 할 수 있습니다. 그리고 마침내 간단한 c 스타일 배열조차도 스택으로 사용할 수 있습니다.

0

벡터에 저장된 내용은 모두 힙의 연속 메모리에 저장됩니다. 스택 작업을 구현하는 데 사용할 수는 있지만 스택으로 작동하도록 설계되지 않았으므로이 경우 실제 스택 구현을 사용하는 것이 더 효과적입니다. *

요소를 추가하거나 제거하면 메모리를 다시 할당 할 수 있으므로 벡터에서 사용하는 메모리를 변경할 수 있습니다.

* 사전에 메모리를 미리 할당 한 경우 스택의 대부분의 구현은 다른 어떤 것보다 대략적으로 효율적입니다.

0

"

vector<Type> vect; 

스택에, 헤더 정보, 즉 벡터를 할당되지만, 자유 공간의 요소 ("힙 ").

vector<Type> *vect = new vector<Type>; 

이 모든 것을 할당 무료 스토어.

vector<Type*> vect; 

무료 스토어에서 스택에 포인터와 묶음을 할당합니다. 다시 말하지만,이 지점은 사용 방법에 따라 결정됩니다 (예를 들어 요소 0을 자유 저장소로, 요소 1을 스택에 가리킬 수 있습니다). "

귀하의 질문에 대한 답변을 larsmans 님이 7-11-11에 있습니다.

3

std::vector 자체는 사용되는 메모리 할당 방식을 정의하지 않습니다. Allocator 객체를 통한 메모리 할당을 수행합니다.

기본적으로 vector<T>std::allocator<T>을 사용하여 할당을 처리합니다. 즉, 메모리를 할당/삭제하려면 operator newoperator delete을 사용합니다.

이들은 모두 변경 될 수 있습니다. 할당 자의 유형은 템플릿 매개 변수로 vector으로 전달되므로 할당을 다르게하는 할당 자 클래스를 작성하려면 완전히 자유롭게 할 수 있습니다. 할당 자에 대한 요구 사항을 충족한다고 가정하면 기본 인스턴스 대신 할당자를 사용하는 std::vector의 인스턴스를 만들 수 있습니다.

클래스 별 및/또는 글로벌 단위로 operator newoperator delete 대체품을 제공 할 수도 있습니다. 그렇게하면 std::allocator<T>은 표준 라이브러리에 정의 된 할당/삭제 루틴 대신 할당/삭제 루틴을 사용합니다.