gpt4 book ai didi

c++ - 删除期间的 CPP Vector 构造函数调用

转载 作者:行者123 更新时间:2023-11-28 04:47:36 25 4
gpt4 key购买 nike

我对删除期间构造函数调用的输出有点困惑。

#include <iostream>
#include <vector>

using namespace std;
class sample
{
public:
sample(){ cout<<"Deafult cons\n";}
sample( int a) { cout<<"Param Cons\n"; }
sample( const sample& Obj ) { cout<<"Copy called\n";}
sample( sample &&objj) { cout<<"Copy Reference cons \n";}
sample& operator=(sample&& other){ cout<<"Copy equal cons \n";}
sample& operator=(sample& other){ cout<<"Normal equal cons \n";}
~sample() {cout<<"Destroy\n";}

};

int main()
{
vector < sample > Object;
Object.push_back( sample() );
Object.push_back( sample() );
cout<<" ********* Going to call Erase ********** \n";
Object.erase( Object.begin() );
cout<<" ********* End of call Erase ********** \n";
return 0;
}

输出是默认缺点//理解,创建临时对象
Copy Reference cons//明白了,搬家赋值
Destroy//销毁临时对象
默认缺点//构造第二个临时对象
Copy Reference cons//将第二个温度的赋值对象移动到 vector
复制调用//在这里,我理解内存不足的原因, vector 增加了大小并试图复制旧对象。
摧毁
摧毁
********* 调用 Erase **********
复制等于缺点
摧毁
********* 通话结束删除 **********
销毁

我的问题,

增加大小后,为什么系统调用 COPY 构造函数而不是 Move 赋值运算符或 Move 构造函数来复制/移动旧对象?

因为再次调用复制构造函数会导致性能问题。

不对请指正

最佳答案

After size is increased, why system is calling COPY Contructor instead of Move assignment operator or Move constructor to copy/move the old object ?

未使用 sample 的移动构造函数,因为它不是 noexcept

复制构造函数的优点是保留了原件。因此,如果在复制过程中抛出异常,到目前为止创建的拷贝可以被丢弃,我们可以回到 vector 的原始状态。

但是,如果在一系列移动过程中抛出异常,我们已经部分改变了原始值的状态,并且无法轻易恢复到原始状态。尝试“移回”一些已经移动的对象在某种程度上可能会引发更多异常,并可能使情况变得更糟,因此未尝试。

因此,如果该类具有复制构造函数,则它优于可能抛出的移动构造函数。如果类(class)只能移动,但不能复制,将尝试移动,我们将不得不祈祷并希望它有效。否则我们可能会在异常期间失去一些成员。

关于c++ - 删除期间的 CPP Vector 构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48960709/

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