C++ vector初始化:这个语法到底是怎么回事

6ovsh4lw  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(168)

我在另一个网站上看到了一些代码,我想知道发生了什么微妙的事情。
考虑一个初始化向量的函数

vector<float>  initvec  ( int nx,  int ny,  int nz ) {
  vector<float> data;
  for (int i = 0; i < nx * ny *nz; ++i){ // assign data elements with sequential values from 0 to nx*ny*nz-1}
  return data;
}

然后再

void other( int nx, in ny, int nz ) {
  …
  vector<float> A( initvec  ( nx, ny, nz ) );
  …
}

我不清楚当向量“A”被创建时到底发生了什么。这至少看起来像是一种不必要的记忆复制。

khbbv19g

khbbv19g1#

我想你可能想知道为什么我们不简单地将initvec函数的结果赋值给A变量,而不是调用一个构造函数。
事实上,在C中这并不重要。你认为,有一个不必要的复制正在进行,但事实并非如此。由于vector实际上是一个类,因此在C#或Java等语言中,当赋值给A变量时,只需复制返回的引用即可。
在C
中我们有move语义--这意味着在这种情况下内存将被重用。在initvec中,data在堆栈上分配,然后沿着return语句复制。然后这个内存被vector类的移动构造函数重用。
另外,我们不能返回data的引用,因为它是在堆栈上分配的(避免在返回时分配内存)。一旦我们把函数地址留给局部变量就不再有效了。然而,我们可以用new operator或使用智能指针在堆上分配这个向量并返回它。这将模仿我前面提到的语言的行为。请记住,在前一种情况下,您信任initvec函数的用户来释放分配的内存。

相关问题