gpt4 book ai didi

c++ - 这是对 intrusive_ptr 的有效使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:47 25 4
gpt4 key购买 nike

在我的代码中,当涉及到 intrusive_ptrs 时,我遵循两条规则:

  • 按值传递原始指针意味着保证原始指针在该函数的生命周期内有效。
  • 如果要在函数的生命周期之外存储和使用原始指针,则应将其存储在 intrusive_ptr 中。

许多 Internet 评论者写道,shared_ptr 应该比 intrusive_ptr 更受欢迎,除非使用第三方代码。但是,intrusive_ptr 避免了传递智能指针,因为您可以从原始指针创建 intrusive_ptr,就像在函数生命周期之外需要对象时一样。

我只是担心我遗漏了一些东西,因为我读过的任何东西都没有说明有关 intrusive_ptrs 的观​​点,而且大多数人似乎更喜欢 shared_ptrs,即使它们会引入内存开销以及使用 enable_shared_from_this 和继承时的问题.

最佳答案

在具有所有权语义的公共(public) API 中传递原始指针应该很少进行,并且只有在绝对必要时才进行。例如。与您无法更改其界面的代码进行交互。

在私有(private) API 中传递原始指针,例如在单个类的成员内是没有问题的。

考虑这三个函数:

void f(A* a);
void g(std::unique_ptr<A> a);
void h(std::shared_ptr<A> a);

f 的所有权语义不清楚。如果你是f的客户您需要阅读文档以了解是否 f将要解除分配 a ,或忽略 a 的所有权问题.

g 的所有权语义清楚了。当您调用 g你传递了 a 的所有权至 g你不再对此负责。 g将取消分配 a或将该资源的所有权转移到其他地方。

h 的所有权语义清楚了。当您调用 h ,你和h成为 a 的共同所有人.最后一个熄灯。

void q(boost::intrusive_ptr<A> a);

qh 具有相同的所有权语义.主要区别在于必须存在以下自由函数:

intrusive_ptr_add_ref(A*);
intrusive_ptr_release(A*);

如果您是 f 的作者然后你在 a 上调用这些函数,你应该记录你这样做。您的客户不一定知道您是。如果你是 f 的客户,你无法知道是否 f除非您阅读其文档,否则将调用这些函数。

如果您是 f 的作者你打算调用intrusive_ptr_*功能,你可以通过编码在你的界面中显式 q相反。

但通常没有令人信服的理由强加给 A 的作者写 intrusive_ptr_*职能。您可以获得与 q 相同的所有权语义通过写作 h相反,不对 A 施加任何进一步的要求.

关于内存开销

如果您创建自己的 shared_ptr与:

 shared_ptr<A> p = make_shared(arguments-to-construct-an-A);

然后是你的shared_ptr将具有与 intrusive_ptr 完全相同的内存开销.该实现将在同一内存分配中分配 A 和引用计数。您的客户不需要知道或关心您的 shared_ptr构建得如此高效。

关于c++ - 这是对 intrusive_ptr 的有效使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709825/

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