Когда векторы выделяются, они используют память в куче или стеке?



все ли следующие утверждения верны?

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?

187   4  

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 stack

True, за исключением последней части, с аналогичным примером счетчика:

  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 в этом случае выделяется на стеке, потому что вы определили его как локальную переменную стека.

    Ничего не найдено.

Добавить ответ:
Отменить.