C++ C++;向量初始化:使用这种语法到底发生了什么?

C++ C++;向量初始化:使用这种语法到底发生了什么?,c++,memory,vector,C++,Memory,Vector,我在另一个网站上看到了一些代码,我想知道其中的微妙之处 考虑一个初始化向量的函数 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} retur

我在另一个网站上看到了一些代码,我想知道其中的微妙之处

考虑一个初始化向量的函数

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;
}
向量initvec(intnx,intny,intnz){ 矢量数据; 对于(int i=0;i 后来

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

我不清楚当向量“A”被创建时,到底发生了什么。它至少看起来像是不必要的内存复制。

我想你会想,我们为什么不简单地将
initvec
函数的结果分配给
A
变量,而不是调用构造函数呢

事实上,C++中没有关系。你认为,有一个不必要的复制正在进行,但事实并非如此。由于vector实际上是一个类,因此在C#或Java等语言中,当赋值给
a
变量时,只需复制返回的引用即可

<>在C++中,我们有移动语义——它意味着在这个场景中内存会被重用。在
initvec
中,在堆栈上分配
数据,然后沿着return语句进行复制。然后,这个内存被
vector
类的move构造函数重用

另外,我们无法返回
数据的引用,因为它是在堆栈上分配的(避免在返回时分配内存)。一旦我们把函数地址留给局部变量,它就不再有效。但是,我们可以在堆上使用
新操作符
或使用智能指针分配此向量并返回它。这将模仿我前面提到的语言的行为。请记住,在前一种情况下,您信任
initvec
函数的用户释放分配的内存。

数据这一切都解释得很好