gpt4 book ai didi

c++ - 使用 unique_ptr 作为方法参数 - 优点和缺点

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:45 24 4
gpt4 key购买 nike

我注意到如果我有以下内容:

#include <memory>
using namespace std;

class Foo
{
public:
Foo();
};

class Wobble
{
public:
void SetWibble( unique_ptr<Foo> foo )
{
this->wibble = move( foo );
}

// I like returning a ref as it gives control to
// the user of my framework over recieving a & or a copy
Foo& GetWibble()
{
return *wibble;
}

unique_ptr<Foo> wibble;
};

int _tmain(int argc, _TCHAR* argv[])
{
unique_ptr<Wobble> wobble;

unique_ptr<Foo> foo( new Foo() ); // Look here
foo->something = ...;
foo->something1 = ...;
foo->something2 = ...;

wobble->SetWibble( move( foo ) );

return 0;
}

...当我声明 foo 时,我有一个很好的 Foo 对象..当我移动它的所有权到 wobble 实例,foo 现在在 int _tmain 范围内是空的。

我非常喜欢这个,因为我认为它正在从 int _tmain 作用域中移除内存和清除指针……在我当前的上下文中,这不需要再摆弄了……与此相反:

// ...
void SetWibble( Foo& foo )
{
this->wibble = foo;
}
// ...

int _tmain(int argc, _TCHAR* argv[])
{
unique_ptr<Wobble> wobble;

Foo foo;
foo.something = ...;
foo.something1 = ...;
foo.something2 = ...;

wobble->SetWibble( foo );

return 0;
}

它仍然在范围内保留对该变量的引用。

问:

  1. 我上面说的对吗?
  2. 我想知道除了我已经指出的那些之外,使用 unique_ptr 和不使用 unique_ptr 是否有任何好处?

最佳答案

您的两个示例之间的主要区别不是使用 std::unique_ptr但是你使用动态内存分配与堆栈上的分配。

通常最好在堆栈上分配对象。您将避免动态内存分配的成本和不必要的指针间接寻址(我看不出有任何理由不一开始就在堆栈上分配 Wobble)。

如果您只是担心在您的范围内有一个变量,也许您可​​以提取出 Foo 的创建到一个单独的函数:

Foo createFoo() {
Foo foo;
foo.something = ...;
foo.something1 = ...;
foo.something2 = ...;
return foo;
}

int main() {
Wobble wobble;
wobble.SetWibble(createFoo());
}

或者,如果 Foo是可移动的,你可以直接移动它而不是移动一个std::unique_ptr<Foo> :

int main() {
Wobble wobble;

Foo foo;
foo.something = ...;
foo.something1 = ...;
foo.something2 = ...;

wobble.SetWibble(std::move(foo));
}

如果这样做,您可能需要优化 SetWibble用于 r 值引用。即使移动没有特别的效率优势foo它至少记录了变量不应再被摆弄。

如果Foo是不可移动的并且复制起来很昂贵然后是的,那么可能有理由动态分配内存。而且,是的,如果您要动态分配内存,最好使用 std::unique_ptr 管理该内存。 .

题外话:

  • 在您的第一个示例中,请注意取消引用 wibbleGetWibble .你有什么保证wibble不为空?它可能永远不会被设置,或者它可能已经明确设置为 nullptr或许这是调用GetWibble的前提条件但它是指针的额外间接寻址如何增加复杂性的一个例子。
  • 在您的第二个示例中,SetWibble 会更符合惯用语获取 const 引用。

关于c++ - 使用 unique_ptr 作为方法参数 - 优点和缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30146433/

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