gpt4 book ai didi

c++ - 为什么 push_back 和 emplace_back 组合在一起时会有不同的行为

转载 作者:行者123 更新时间:2023-11-30 02:18:42 24 4
gpt4 key购买 nike

在下面的代码中:

struct aa
{
int a;
aa( int x):a(x){ cout<<"const is called"<<endl;}
~aa(){cout <<"dest is called"<<endl;}
aa( aa&& obj)
{
a = obj.a;
cout<<"move const is called"<<endl;
}
};
int main ()
{
vector<aa> v1;
v1.push_back(aa(9));
v1.emplace_back(9);
}
  1. 当只使用push_back时,结果是预期的(移动构造函数,构造函数和析构函数被调用。)

结果:

const is called
move const is called
dest is called
dest is called
  1. 当只使用emplace_back时,结果是预期的(不调用Move构造函数,只调用构造函数和析构函数。)

结果:

const is called
dest is called
  1. 但是当我将push_backemplace_back结合使用时,为什么emplace_back调用了移动构造函数,而单独使用时却没有调用它) ?

结果:

const is called
move const is called
dest is called
const is called
move const is called
dest is called
dest is called
dest is called

最佳答案

因为当您同时使用 push_backemplace_back 时,您将向 v1 添加两个元素。在第二次重新分配发生时,将创建新的内部缓冲区并将现有元素复制/移动到新的内部缓冲区。

您可以提前使用reserve来防止重新分配。

vector<aa> v1;
v1.reserve(2);
v1.push_back(aa(9));
v1.emplace_back(9);

关于c++ - 为什么 push_back 和 emplace_back 组合在一起时会有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51910615/

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