WinRT有垃圾回收吗?

22

WinRT有垃圾回收吗?

还是像COM一样采用引用计数?


1
是的,WinRT有某种垃圾回收机制,更有趣的问题是它是哪种类型的?(如果像VB6中那样对程序员隐藏得很好,而不是ATL,则引用计数是一种有效的垃圾回收类型) - Ian Ringrose
"WinRT有垃圾回收吗?" - 有的。 "还是像COM一样进行引用计数?" - 那也是垃圾回收。似乎每个人都以错误的方式考虑垃圾回收:"垃圾回收是通过回收程序不会注意到丢失的内存来模拟具有无限内存的计算机。" - IInspectable
1个回答

24

我发现这篇文章引述了微软的Martyn Lovell

"WinRT对象像COM一样进行引用计数的内存管理,使用弱引用以避免循环引用。"

显然,这是在他在BUILD会议上关于WinRT内部的演讲中提到的。


8
顺便提一句,虽然有些显而易见,但还是值得澄清一下,使用WinRT的.NET应用程序仍会运行GC以处理.NET对象。同样,JS也有GC来处理自己的对象。只有WinRT对象是基于引用计数(refcounted)的。 - Pavel Minaev
4
@dalle,从某种意义上讲,在.NET底部没有COM,因为.NET对象不是COM对象。然而,WinRT对象是COM对象 - 它们实现了"IUnknown"。而且,在使用新的/Zw编译器语法的Metro C++应用程序中,ref class类型的实例是有引用计数的,使用AddRef/Release。字符串也是如此,尽管它们有自己的引用计数函数。使用"/FAs"编译并自行查看。 - Pavel Minaev
1
@Pavel Minaev:.NET 对象不是 COM 对象,你说得对。但是 .NET 使用 Win32 和 COM 对象进行所有系统相关的调用,因为 Windows 没有系统 .NET API。WinRT 可能是 refcounted 的,但是它上面的层次,比如 MetroC++,可能不是。如果它们是 refcounted 的话,扩展的 MetroC++ 语法根本不需要,因为标准 C++ 轻松处理 refcounted 对象。编辑:你有 /Zw 和 /FAs 的文档链接吗? - dalle
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/3483/discussion-between-pavel-minaev-and-dalle - Pavel Minaev
@dalle:我认为微软决定使用C++/CX作为语言投影,是因为基于标准C ++的投影的编译器支持仍然缺乏。与此同时,编译器已经实现了新的C++功能,并且从Modern来看,似乎可以将WinRT投影纯粹作为标准C++库进行实现。 - IInspectable
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接