gpt4 book ai didi

c++ - 我应该在移动构造函数中 std::move 一个 shared_ptr 吗?

转载 作者:IT老高 更新时间:2023-10-28 22:32:10 24 4
gpt4 key购买 nike

考虑:

#include <cstdlib>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

class Gizmo
{
public:
Gizmo() : foo_(shared_ptr<string>(new string("bar"))) {};
Gizmo(Gizmo&& rhs); // Implemented Below

private:
shared_ptr<string> foo_;
};

/*
// doesn't use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(rhs.foo_)
{
}
*/


// Does use std::move
Gizmo::Gizmo(Gizmo&& rhs)
: foo_(std::move(rhs.foo_))
{
}

int main()
{
typedef vector<Gizmo> Gizmos;
Gizmos gizmos;
generate_n(back_inserter(gizmos), 10000, []() -> Gizmo
{
Gizmo ret;
return ret;
});

random_shuffle(gizmos.begin(), gizmos.end());

}

在上面的代码中,有两个版本的Gizmo::Gizmo(Gizmo&&)——一个使用std::move来实际move shared_ptr,另一个只是复制 shared_ptr

这两个版本似乎都在表面上起作用。一个区别(我能看到的唯一区别)是在非 move 版本中,shared_ptr 的引用计数暂时增加,但只是短暂增加。

我通常会继续move shared_ptr,但只是为了在我的代码中保持清晰和一致。我在这里错过了一个考虑吗?出于任何技术原因,我应该更喜欢一个版本吗?

最佳答案

这里的主要问题不是由于 shared_ptr 中额外的原子递增和递减导致的微小性能差异,而是除非您执行移动,否则操作的语义不一致。

虽然假设 shared_ptr 的引用计数只是暂时的,但语言中没有这样的保证。您要从中移动的源对象可以是临时的,但它也可能具有更长的生命周期。它可能是一个已被强制转换为 rvalue-reference 的命名变量(比如 std::move(var)),在这种情况下不是 moving 来自 shared_ptr 您仍然与移动源保持 shared 所有权,并且如果目标 shared_ptr 的范围较小,则指向对象的生命周期将不必要地延长。

关于c++ - 我应该在移动构造函数中 std::move 一个 shared_ptr 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953325/

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