Когда векторы выделяются, они используют память в куче или стеке?
все ли следующие утверждения верны?
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stack
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stack
vector<Type*> vect; //vect will be on stack and Type* will be on heap.
как память выделяется внутренне для Type на vector или любой другой контейнер STL?
4 ответов:
vector<Type> vect;выделяет
vector, т. е. информация заголовка, в стеке, но элементы в свободном хранилище ("куча").vector<Type> *vect = new vector<Type>;выделяет все в свободном хранилище.
vector<Type*> vect;выделяет
vectorв стеке и куче указателей на свободный магазин, но где эти точки определяются тем, как вы их используете (вы можете указать элемент 0 на свободный магазин и элемент 1 на стек, скажем).
предполагая реализацию, которая фактически имеет стек и кучу (стандартный C++ не требует наличия таких вещей), единственным истинным утверждением является последнее.
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stackэто правда, за исключением последней части (
Typeне будет в стеке). Представьте себе:void foo(vector<Type>& vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec.push_back(Type()); } int main() { vector<Type> bar; foo(bar); }дополнительно:
vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stackTrue, за исключением последней части, с аналогичным примером счетчика:
void foo(vector<Type> *vec) { // Can't be on stack - how would the stack "expand" // to make the extra space required between main and foo? vec->push_back(Type()); } int main() { vector<Type> *bar = new vector<Type>; foo(bar); }для:
vector<Type*> vect; //vect will be on stack and Type* will be on heap.это правда, но обратите внимание здесь что за
Type*указатели будут в куче, ноTypeэкземпляры, на которые они указывают, не обязательно должны быть:int main() { vector<Type*> bar; Type foo; bar.push_back(&foo); }
vector<Type> vect; //allocates vect on stack and each of the Type (using std::allocator) also will be on the stackнет,
vectбудет в стеке,но массив, который он использует внутренне для хранения элементов, будет в куче. Элементы будут находиться в этом массиве.vector<Type> *vect = new vector<Type>; //allocates vect on heap and each of the Type will be allocated on stackнет. То же, что и выше, только
vectorкласс будет в куче.vector<Type*> vect; //vect will be on stack and Type* will be on heap.
vectбудет в стеке, его элементы (указатели наType) будет в куче, и вы не можете сказать, где будетTypes точка указателей к. Может быть в стеке, может быть в куче, может быть в глобальных данных, может быть нигде (т. е.NULLуказатели).кстати реализация может на самом деле хранить некоторые векторы (обычно небольшого размера) в стеке полностью. Не то чтобы я знал о такой реализации, но это возможно.
только это утверждение верно:
vector <Type*> vect; //vect will be on stack and Type* will be on heap.
Type*указатели выделяются в куче, потому что количество указателей может динамически меняться.
vectв этом случае выделяется на стеке, потому что вы определили его как локальную переменную стека.
Comments