如果我通过引用传递矢量,然后将新元素推到该矢量上,并且当我在函数中推入元素时必须动态调整数组的大小,那么矢量现在是否位于其他位置?程序如何确保它指向新的动态分配位置?是否使用了指向当前数组存储位置的指针,该指针可以在调整大小后指向内部的新连续存储位置进行修改?
void func(vector<int> &vect)
{
vect.push_back(30);
}
int main()
{
vector<int> vect;
func(vect);
}
答案 0 :(得分:0)
答案是肯定的。您可以通过尝试弄清楚代码示例中发生的事情来自己确认。关键见解是,任何非动态分配的内容在分配时都必须具有固定的大小。
这里没有指针,因此矢量的核心数据结构正在堆栈中分配,在这里它不能仅仅发展为可能在堆栈顶部的其他事物。例如,当您位于func()
内时,对func
的函数调用位于向量变量顶部的堆栈中。如果不覆盖函数调用的堆栈框架,它就不可能在那里增长。如果这样做,您的程序将在尝试从func
返回时崩溃。
因此,它可能增长的唯一方法是在内部根据需要在不同的位置动态分配内存。因此,这一定是引擎盖下发生的事情。