gpt4 book ai didi

c++ - 将共享指针作为参数传递

转载 作者:IT老高 更新时间:2023-10-28 12:03:10 26 4
gpt4 key购买 nike

如果我声明一个包含在共享指针中的对象:

std::shared_ptr<myClass> myClassObject(new myClass());

然后我想将它作为参数传递给方法:

DoSomething(myClassObject);

//the called method
void DoSomething(std::shared_ptr<myClass> arg1)
{
arg1->someField = 4;
}

以上是否只是增加了 shared_pt 的引用计数并且一切都很酷?还是留下一个悬空指针?

你还应该这样做吗?:

DoSomething(myClassObject.Get());

void DoSomething(std::shared_ptr<myClass>* arg1)
{
(*arg1)->someField = 4;
}

我认为第二种方式可能更有效,因为它只需要复制 1 个地址(而不是整个智能指针),但第一种方式似乎更具可读性,我预计不会插入性能限制。我只是想确保它没有危险。

谢谢。

最佳答案

I want to pass a shared pointer to a function. Can you help me with that?

当然,我可以帮你。我假设您对 C++ 中的所有权语义有一定的了解。这是真的吗?

Yeah, I'm reasonably comfortable with the subject.

很好。

好吧,我只能想到两个理由来接受 shared_ptr 参数:

  1. 函数想要共享对象的所有权;
  2. 该函数执行一些专门针对 shared_ptrs 的操作。

你对哪一个感兴趣?

I'm looking for a general answer, so I'm actually interested in both. I'm curious about what you mean in case #2, though.

此类函数的示例包括 std::static_pointer_cast、自定义比较器或谓词。例如,如果你需要从一个 vector 中找到所有唯一的 shared_ptr,你就需要这样一个谓词。

Ah, when the function actually needs to manipulate the smart pointer itself.

没错。

In that case, I think we should pass by reference.

是的。如果它不改变指针,你想通过 const 引用传递。无需复制,因为您不需要共享所有权。那是另一种情况。

Ok, got it. Let's talk about the other scenario.

您共享所有权的那个?好的。您如何与 shared_ptr 共享所有权?

By copying it.

那么函数需要复制一个shared_ptr,对吗?

Obviously. So I pass it by a reference to const and copy to a local variable?

不,这是一种悲观情绪。如果通过引用传递,函数将别无选择,只能手动进行复制。如果它是按值传递的,编译器将在复制和移动之间选择最佳选择并自动执行。所以,按值传递。

Good point. I must remember that "Want Speed? Pass by Value." article more often.

Wait, what if the function stores the shared_ptr in a member variable, for example? Won't that make a redundant copy?

该函数可以简单地将 shared_ptr 参数移动到其存储中。移动 shared_ptr 很便宜,因为它不会改变任何引用计数。

Ah, good idea.

But I'm thinking of a third scenario: what if you don't want to manipulate the shared_ptr, nor to share ownership?

在这种情况下,shared_ptr 与函数完全无关。如果您想操作指针对象,请获取指针对象,然后让调用者选择他们想要的所有权语义。

And should I take the pointee by reference or by value?

通常的规则适用。智能指针不会改变任何东西。

Pass by value if I'm going to copy, pass by reference if I want to avoid a copy.

没错。

Hmm. I think you forgot yet another scenario. What if I want to share ownership, but only depending on a certain condition?

啊,一个有趣的边缘案例。我不希望这种情况经常发生。但是当它发生时,您可以通过值传递并在不需要时忽略拷贝,或者通过引用传递并在需要时制作拷贝。

I risk one redundant copy in the first option, and lose a potential move in the second. Can't I eat the cake and have it too?

如果您处于真正重要的情况,您可以提供两个重载,一个采用 const 左值引用,另一个采用右值引用。一个复制,另一个移动。完美转发功能模板是另一种选择。

I think that covers all the possible scenarios. Thank you very much.

关于c++ - 将共享指针作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10826541/

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