Я новичок в С++, и я использую класс vector в моем проекте. Я нашел это весьма полезным, потому что у меня может быть массив, который автоматически перераспределяется всякий раз, когда это необходимо (т.е. Если я хочу push_back элемент, и вектор достиг максимальной емкости, он перераспределяет себя, запрашивая больше памяти для ОС), поэтому доступ к элементу вектора очень быстрый (это не похоже на список, который для достижения "n-го" элемента должен пройти через "n" первых элементов).
Я нашел этот вопрос очень полезным, потому что их ответы прекрасно объясняли, как работает "распределитель памяти", когда я хочу сохранить свой вектор в куче/стеке:
[1] vector<Type> vect;
[2] vector<Type> *vect = new vector<Type>;
[3] vector<Type*> vect;
Однако, какое-то сомнение вызывает у меня какое-то время, и я не могу найти ответ: Всякий раз, когда я создаю вектор и начинаю нажимать много элементов, он достигнет момента, когда вектор будет заполнен, поэтому для продолжения роста ему нужно будет перераспределить, скопировать себя в новое место и затем продолжите pushing_back элементы (очевидно, это перераспределение скрыто для реализации класса, поэтому оно полностью прозрачно для меня)
Хорошо, если я создал вектор в куче [2], у меня нет проблем, представляющих, что может случиться: вызовы класса vector malloc, приобретают новое пространство, а затем копируют себя в новую память и, наконец, удаляют старую память звоните бесплатно.
Тем не менее, вуаль скрывает то, что происходит, когда я конструирую вектор в стеке [1]: что происходит, когда вектор должен перераспределяться? AFAIK, всякий раз, когда на C/С++ вы вводите новую функцию, компьютер будет искать объявление переменных, а затем развернуть стек, чтобы получить необходимое пространство для размещения этих переменных, но вы не можете выделить больше места в стеке, когда функция уже запущена. Как вектор класса решает эту проблему?