【问题标题】:Does WinRT have Garbage Collection?WinRT 有垃圾收集吗?
【发布时间】:2011-11-17 11:47:09
【问题描述】:

WinRT 有垃圾收集吗?

还是像 COM 一样进行引用计数?

【问题讨论】:

  • 是的,WinRT 有某种垃圾收集,更有趣的问题是它是什么类型的? (引用计数是一种有效的垃圾收集类型,如果它像 VB6 那样对程序员隐藏得很好,而不是 ATL)
  • “WinRT 有垃圾收集吗?” - 是的。 “或者它是否像 COM 一样进行引用计数?” - 这也是垃圾收集。似乎everybody thinks about garbage collection the wrong way“垃圾收集是模拟具有无限内存量的计算机 [通过] 回收程序不会注意到丢失的内存。”

标签: memory-management garbage-collection reference-counting windows-runtime


【解决方案1】:

我找到了this article,其中引用了微软的Martyn Lovell

“WinRT 对象像 COM 一样被引用计数以进行内存管理, 用弱引用来避免循环。”

显然,他在BUILD convention 上关于 WinRT 内部的演讲中提到了这一点。

【讨论】:

  • 附带说明,虽然这有点明显,但仍然值得澄清的是,使用 WinRT 的 .NET 应用程序仍将运行 GC 来处理 .NET 对象。同样,JS 对自己的对象也有 GC。只有 WinRT 对象被引用。
  • .NET 的底部有 Win32 和 COM,它们也被引用。说明 .NET 会因此被重新计数,就像说明 Metro C++/CLI(-ish) 应用程序被重新计数一样真实。
  • @dalle .NET 的底部没有 COM,从某种意义上说 .NET 对象不是 COM 对象。然而,WinRT 对象 COM 对象——它们实现IUnknown。而且,是的,在使用新的 /Zw 编译器语法的 Metro C++ 应用程序中,ref class 类型的实例被引用,使用AddRef/Release。字符串也是如此,尽管它们有自己的引用计数功能。使用/FAs 编译并亲自查看。
  • @Pavel Minaev:.NET 对象不是 COM 对象,你说得对。但是 .NET 对所有与系统相关的调用使用 Win32 和 COM 对象,因为 Windows 没有系统 .NET API。 WinRT 可能会被引用,但它上面的层(例如 MetroC++)可能不会。如果它们被重新计数,则根本不需要 extended MetroC++ 语法,因为标准 C++ 可以轻松处理重新计数的对象。编辑:你有 /Zw 和 /FAs 的文档链接吗?
猜你喜欢
  • 2011-09-28
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2019-11-08
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多