通过引用和动态分配传递向量

passing vectors by reference and dynamic allocation

本文关键字:向量 动态分配 引用      更新时间:2023-10-16

如果我通过引用传递一个向量,并将新元素推送到向量,并且在我在函数中推送元素时它必须动态调整数组的大小,矢量现在会在不同的位置吗?程序如何确保它指向新的动态分配位置?它是否使用指向指向当前数组内存位置的指针的指针,该指针在调整大小后可以修改为指向引擎盖下的新连续内存位置?

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

答案是肯定的。您可以通过尝试找出代码示例中发生的情况来确认这一点。关键的见解是,任何非动态分配的内容在分配时都必须具有固定的大小。

你在这里没有指针,所以向量的核心数据结构是在堆栈上分配的,在那里它不能只是增长到堆栈中可能位于它之上的其他东西。例如,当你在 func() 中时,对 func 的函数调用位于向量变量顶部的堆栈上。如果不覆盖函数调用的堆栈帧,它就不可能在那里增长。如果这样做,您的程序在尝试从func返回时会崩溃。

因此,它

可能增长的唯一方法是,在内部,它根据需要在不同的位置动态分配内存。所以,这一定是引擎盖下发生的事情。