ARTICLE · 软件编程
为什么我们没有用 Co_Register_Initialize_Spy 来清理无法封送的委托?
一语总结文章解释了为什么 Co_Register_Initialize_Spy 函数不适合用于清理非敏捷对象,因为它要求包装对象本身是敏捷的,这会带来在错误套间中运行的风险,并且它对注销施加的限制与标准清理流程相冲突。
作者讨论了使用 Co_Register_Initialize_Spy 管理非敏捷对象生命周期的局限性。该函数要求注册的对象必须是敏捷的,这与为非敏捷组件创建包装对象的目标相矛盾。此外,回调机制限制了在 OnUninitialize 阶段进行注销,这与其他依赖该函数进行清理的对象产生了潜在冲突。文章得出结论,这种方法对于预期的使用场景并不实用。
- 敏捷性要求
Co_Register_Initialize_Spy 要求注册的对象必须是敏捷的。这迫使开发者围绕非敏捷对象创建一个敏捷包装器,违背了初衷,并引入了包装器在错误套间中执行的风险。
- 注销限制
该函数明确警告不要在 OnUninitialize 回调中调用 Co_Unregister_Initialize_Spy。这一限制使清理过程变得复杂,因为被包装对象的析构函数可能需要执行间接触发该注销的操作,从而导致潜在的死锁或错误。
- 性能影响
套间关闭列表的实现针对罕见的注销操作进行了优化(注册为 O(1),注销为 O(n))。所提出的设计需要频繁注销,这会降低性能,并且与该 API 的预期使用模式不符。
为什么我们没有用 Co_Register_Initialize_Spy 来清理无法封送的委托?
作者讨论了使用 Co_Register_Initialize_Spy 管理非敏捷对象生命周期的局限性。该函数要求注册的对象必须是敏捷的,这与为非敏捷组件创建包装对象的目标相矛盾。此外,回调机制限制了在 OnUninitialize 阶段进行注销,这与其他依赖该函数进行清理的对象产生了潜在冲突。文章得出结论,这种方法对于预期的使用场景并不实用。
文章金句
"注册用于套间关闭的对象必须是敏捷的。(如果传入非敏捷对象,调用将失败。)
"不要在 OnUninitialize 回调中调用 Co_Unregister_Initialize_Spy 函数。
"所提出的替代设计会注销大量套间关闭回调,因此它把套间关闭回调列表推向了它并未针对其优化的使用模式。