【问题标题】:Handles vs Smart pointers. What to use?句柄与智能指针。用什么?
【发布时间】:2011-07-17 14:11:51
【问题描述】:

我开始开发一个图形引擎,只是为了练习。出现的第一个问题是使用句柄或智能指针来引用我的类实例。

在我看来:

  • 智能指针优点:按需创建,它们不存在成为过时指针的问题;缺点:由于它们在链表中,因此搜索指针是一个 O(n) 操作。

  • 处理优点:搜索是 O(1),对象重定位是 O(1);缺点:可以成为过时的指针,创建新句柄会强制系统检查句柄表中的第一个 NULL 条目。

选择哪一个?请解释您的选择。

已编辑:

我想在你的cmets和答案之后澄清一些观点。

我并不是说智能指针是“由 STL 链表表示”的链表。我的意思是它们在某种程度上表现为一个链表(如果你将一个对象从一个内存块移动到另一个,你需要迭代智能指针的完整列表以正确更新对该对象的所有引用——它可以用链表-)。

我的意思并不是说完全像不透明指针或指向实现模型的指针那样处理。我的意思是有一个全局句柄表(一个指针数组),所以当我请求一个对象时,我会得到一个可取消引用的实例,其中包含该表中的索引,可以找到指向该对象的实际指针。因此,如果我将对象从一个块移动到另一个块,只需更新句柄表中的指针条目,我就会同时自动更新所有指针。

【问题讨论】:

  • 您能否详细说明一下您在使用“句柄”一词时的确切含义?
  • 另外,“搜索指针”到底是什么意思,为什么说智能指针存储在链表中?
  • @davidcm: 通常handle 表示一个不透明的实体(可能是指针),在第一次调用打开设备或文件等之后用作标识符。不确定,什么样的handle你指的是这里。
  • 你为什么希望像这样在内存中移动对象?即使在定期压缩堆的 GC 语言中,您也不会重新排列对象,系统会这样做。
  • 根据他的评论(关于压缩内存块),我认为他在谈论使用类似MacOS (pre-X) memory model 的东西,其中句柄是指向“主指针”中系统控制和更新的指针的指针块”,可以在需要压缩内存时以集中方式更新。

标签: c++ handle smart-pointers


【解决方案1】:

这些定义都不符合通常使用的定义。智能指针根本不在链表中。通常,您使用观察者模式来保留指向仍然存在的对象的原始指针向量,如果您需要迭代它们或其他东西。您所描述的句柄几乎仅用于二进制兼容性的原因,并且从不在进程中。

使用智能指针,它们会自行处理。

【讨论】:

    【解决方案2】:

    术语“句柄”是一个广义术语,本质上是指对象的标识符。

    指针或智能指针属于此定义,因此您需要为选项 2 选择一个更简洁的术语。

                 "Handle"
                     |
              /------+-------\
             /       |         \
            /        |           \
        Pointer    Reference    Other Identififer
           |         |             \
      |----+----|   `T&`             \
      |         |                 |---+------|
     `T*`  `shared_ptr<T>`      Text       Number (e.g. HWND in WinAPI)
    

    如果我假设您的意思是一些固定的、内存抽象的“其他标识符”,那么您当然可以使用它。你不一定有一个非此即彼的场景。您可能希望无论如何使用智能指针(如果没有别的,用于生命周期管理),并且智能指针不需要在链表中。

    您可以使用std::map&lt;your_identifier_type, std::shared_ptr&lt;T&gt; &gt; 将您的固定、用户定义的标识符映射到[可能更改的] 智能指针。


    免责声明:这张图是仓促绘制的,代表了我在起床半小时后对术语树的看法。与其他观点可能存在细微差异,但应该给人以相当可靠的印象。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2021-07-03
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多