gpt4 book ai didi

c++ - std::move 初始化列表

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:47 25 4
gpt4 key购买 nike

我经常在生产代码中看到以下惯用语:值参数(如共享指针)被传递到构造函数并应被复制一次。为确保这一点,参数被包装到 std::move 应用程序中。讨厌样板代码和正式噪音我想知道这是否真的有必要。如果我删除该应用程序,至少 gcc 7 会输出一些不同的程序集。

#include <memory>

class A
{
std::shared_ptr<int> p;
public:
A(std::shared_ptr<int> p) : p(std::move(p)) {} //here replace with p(p)

int get() { return *p; }
};

int f()
{
auto p = std::make_shared<int>(42);
A a(p);
return a.get();
}

Compiler Explorer告诉你区别。虽然我不确定这里最有效的方法是什么,但我想知道是否存在允许将 p 视为特定位置的右值引用的优化?它当然是一个命名实体,但无论如何该实体在该位置之后“死亡”。

将“死”变量视为右值引用是否有效?如果不是,为什么?

最佳答案

在构造函数的主体中,有两个p 对象,ctor 参数和this->p。没有 std::move,它们是相同的。这当然意味着所有权在两个指针之间共享。这必须以线程安全的方式实现,而且代价高昂。

但是优化它是相当困难的。编译器通常不能推断所有权是多余的。通过自己编写 std::move,您明确表示 ctor 参数 p 不需要保留所有权。

关于c++ - std::move 初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727172/

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