передача векторов по ссылке и динамическому распределению - PullRequest
0 голосов
/ 12 апреля 2019

Если я передам вектор по ссылке, и я добавлю новые элементы в вектор, и он должен динамически изменять размер массива, в то время как я помещаю элементы в функцию, будет ли вектор теперь находиться в другом месте?Как программа гарантирует, что она указывает на новое динамически размещаемое местоположение?Использует ли он указатель на указатель, который указывает на текущую ячейку памяти массива, которую можно изменить после изменения размера, чтобы указать новую непрерывную ячейку памяти под капотом?

void func(vector<int> &vect) 
{ 
   vect.push_back(30); 
} 

int main() 
{ 
    vector<int> vect; 
     func(vect);

}

1 Ответ

0 голосов
/ 12 апреля 2019

Ответ - да. Вы можете убедиться в этом сами, попытавшись выяснить, что происходит в вашем примере кода. Ключевым моментом является то, что все, что выделяется не динамически, должно иметь фиксированный размер во время выделения.

У вас нет указателя здесь, поэтому основная структура данных вектора распределяется в стеке, где он не может просто перерасти в другие вещи, которые потенциально находятся над ним в стеке. Например, пока вы находитесь внутри func(), вызов функции func находится в стеке поверх вашей векторной переменной. Он не может расти там без перезаписи стекового фрейма для вашего вызова функции. Если это так, ваша программа вылетит при попытке вернуться с func.

Таким образом, единственный способ, которым он может расти, - это если внутренне динамически распределять память в другом месте по мере необходимости. Итак, это должно быть то, что происходит под капотом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...