我开始为实践目的开发图形引擎。出现的第一个问题之一是使用句柄或智能指针来引用我的类实例。
从我的观点来看:
智能指针优点:根据需求创建,他们没有成为过时指针的问题;缺点:因为它们在链表中,搜索指针是O(n)操作。
处理专业人员:搜索是O(1),对象重定位是O(1);缺点:可以成为过时的指针,创建一个新的句柄强制系统检查句柄表中的第一个NULL条目。
选择哪一个?请解释您的选择。
编辑:
我想在你的评论和答案之后澄清一些观点。
我并不是说智能指针是“由STL链表表示”的链表。我的意思是它们在某种程度上表现为链表(如果将一个对象从一个内存块移动到另一个内存块,则需要迭代完整的智能指针列表以正确更新对该对象的所有引用 - 可以使用链表 - )。
我并不认为句柄与不透明指针或指向实现模型的指针完全相同。我的意思是有一个全局句柄表(一个指针数组),所以当我请求一个对象时,我得到一个可解除引用的实例,其中包含该表中可以找到该对象的实际指针的索引。因此,如果我将对象从一个块移动到另一个块,只需更新句柄表中的指针条目,我就可以同时自动更新所有指针。
答案 0 :(得分:2)
这些定义都不符合通常使用的定义。智能指针完全不在链表中。通常,您需要使用观察者模式来保留原始指针的向量,这些指针指向仍然存在的对象(如果您需要迭代它们或其他东西)。您描述的句柄几乎仅用于二进制兼容性原因而且从不在进行中。
使用智能指针,他们会照顾好自己。
答案 1 :(得分:1)
术语“句柄”是一个广义术语,实质上是指对象的标识符。
指针或智能指针属于此定义,因此您需要为选项2选择一个更复杂的术语。
"Handle"
|
/------+-------\
/ | \
/ | \
Pointer Reference Other Identififer
| | \
|----+----| `T&` \
| | |---+------|
`T*` `shared_ptr<T>` Text Number (e.g. HWND in WinAPI)
如果我认为你的意思是一些固定的,内存抽象的“其他标识符”那么,当然,你可以使用它。您不一定在这里有/或场景。你可能想要使用智能指针无论如何(对于终身管理,如果没有别的),智能指针不需要在链表中。
您可以使用std::map<your_identifier_type, std::shared_ptr<T> >
将固定的,用户定义的标识符映射到[可能会发生变化的]智能指针。
免责声明:这张图是匆匆绘制的,代表了我现在对术语树的看法,即起床后半小时。与其他观点可能存在细微的差异,但它应该给出相当可靠的印象。