Dyikot
@Dyikot

Вопрос про указатели. Правильно ли я понимаю?

vector<type> name;  // вектор хранится в стеке, и значения тоже?
vector<type*> name; //  вектор хранится в стеке, а значения в куче?
vector<type> *name = new vector<type>;  // вектор хранится в куче, а значения в стеке?
vector<type*> *name = new vector<type*>; // вектор хранится в куче, а значения тоже в куче?

Подскажите пожайлуста.
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
@dima20155
you don't choose c++. It chooses you
Вы немного путаетесь с указателями.
int name1 = 42; // - локальная переменная типа int, хранится на стеке
int* name2; // - локальная переменная типа указатель на int. Сама переменная (! не её значение) хранится на стеке. 
int* name3 = &name1;  // - аналогично name2, Значение переменной указывает на переменную, которая хранится на стеке
int* name4 = new int(84);  // - аналогично name3, Значение переменной указывает на переменную, которая хранится в куче.


Аналогично и с векторами:
vector<int> v1; // - хранит значения переменных
vector<int*> v2; //- хранит указатели на переменные (которые не обязаны вообще быть чем-либо инициализированы, и могут находиться в любом из 4-ех типов типов памяти)
vector<int>* v3; // - указатель на std::vector<int> (может находиться в любом типе памяти).
vector<int*>* v4; // - комбинация v2 и v3.


new vector<int>; Лишь выделяет память в куче и никак не связан с типами переменных. Вот пример
int v5 = *new int(42);

В данном случае будет выделено место в куче, затем (в общем случае) вызван конструктор. Созданная в куче переменная будет хранить 42. Затем мы создаем переменную v5 на стеке и копируем в неё (конструктор копирования в общем случае) значение переменной из кучи. Указатель же на переменную в куче будет потерян aka memory leak.
Вот, кстати, примерчик.
https://godbolt.org/z/eETGh3Whb

Динамически выделить на стеке можно с помощью _malloca(size). Но, в общем, случае делать этого не стоит и это остается уделом тех, кто очень тонко хочет оптимизировать код. std::array принимает одним из параметров шаблона размер, соотвествнно в момент компиляции размер необходимого массива известен и его можно хранить на стеке (по сути это обертка над C-array, удобная и безопастная). Подозреваю, что в случае гиганских размеров std::array есть вероятность, что он может быть расположен в куче (подтверждений и опровержений этому не нашел!).

P.S. Да, многовато вышло.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
RabraBabr
@RabraBabr
У вектора из стандартной библиотеки, где бы он не был, буфер data всегда хранится в динамической памяти . SBO оптимизацию он не делает насколько я помню в отличие от бустовского. Сейчас меня поправят если я ошибся. Для размещения данных в стеке используйте std::array.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы