gpt4 book ai didi

c++ - 将项目附加到 vector 会复制所有先前的项目

转载 作者:搜寻专家 更新时间:2023-10-30 23:54:54 24 4
gpt4 key购买 nike

在下面的代码中,我希望永远不会调用 A 的复制构造函数,因为应该使用 emplace_back 直接在 vector 中创建项,然后总结果应该是返回值优化的。

好像是这样的。但是,每次我追加到 vector 时,所有以前的项目都会作为 emplace_back 调用的结果被复制。为什么会这样?

#include <iostream>
#include <vector>
#include <string>

using namespace std;


static int _id = 0;

class A{
public:
A(): name(_id++){
cout << "Created" << this->name << endl;
}

A(const A& other): name(other.name){
cout << "Copied" << this->name << endl;
}

A(const A&& other): name(other.name){
cout << "Moved" << this->name << endl;
}

~A(){
cout << "Deleted"<< this->name <<endl;
}

private:
int name;
};


vector<A> f2(){
cout << "Entering f2" << endl;
auto ret = vector<A>();
for (int i = 0; i < 3; i++){
//auto obj = A();
cout << "Adding obj" << endl;
ret.emplace_back();
cout << "Added obj" << endl;
}
cout << "Returning" << endl;
return ret;
}

int main()
{
{
auto c = f2();
cout << "Exiting stack" << endl;
}
return 0;
}

我用 gcc 4.8.4 编译它,使用以下任何一个:

gcc main.cpp -std=c++11
gcc main.cpp -std=c++11 -O3

输出是:

Entering f2
Adding obj
Created0
Added obj
Adding obj
Created1
Copied0
Deleted0
Added obj
Adding obj
Created2
Copied0
Copied1
Deleted0
Deleted1
Added obj
Returning
Exiting stack
Deleted0
Deleted1
Deleted2

我希望没有拷贝,比如:

Entering f2
Adding obj
Created0
Added obj
Adding obj
Created1
Added obj
Adding obj
Created2
Added obj
Returning
Exiting stack
Deleted0
Deleted1
Deleted2

push_back 改变 emplace_back 并不能解决这个问题,而且会增加额外的移动。

最佳答案

当存储空间用完时,Vector 会重新分配其内存块,并将旧对象复制到新位置。您可以通过调用 vector.reserve(<expected number of items>); 显着减少此类重新分配的次数。
另外值得注意的是 vector 保证摊销常量 push_back复杂。这意味着随着您不断添加项目,重新分配的频率会越来越低,因此通常无需担心。

或者,如果您只需要某种容器而不需要在内存中连续分配它,请考虑使用不同的容器。喜欢std::deque .

关于c++ - 将项目附加到 vector 会复制所有先前的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com