2016-01-06 57 views
0

除了跨平台,交叉编译器的兼容性,Microsoft Visual C++(C++ Component Extensions)句柄与对象操作符(^)和C++ 11 std :: shared_ptr之间的显着区别是什么?Visual Studio的帽子操作符和C++ shared_ptr之间存在什么显着的内存和GC差异?

似乎都通过使用引用计数的支持自动垃圾收集和我会假设需要一些额外的内存来跟踪此信息。这种额外的内存开销是否显着,这两种实现之间有很大不同?

此外,在那里管理方式时无用单元收集无论是在MS C++组件扩展或C++ 11个环境中会出现,以防止在不适当的时间拖延?

MSDN文档: Handle to Object Operator (^) (C++ Component Extensions)

C++ 11 smart_ptr:std::shared_ptr

+2

这东西都是正交的。没有办法给出简洁和正确的答案。 –

+0

我不明白你使用正交。每个实现的内存开销应该是一个理解的组件,但我无法找到任何有关每个指针涉及多少或哪些内容的文档。另外,如果有控制GC在每个环境中发生的方法,那么控制程序的性能将会很有用。 – CodeWriter

+2

你真的更喜欢将MS CLI和标准C++作为两种完全不同的语言;打算在两个完全不同的环境中运行。恕我直言...... – paulsm4

回答

2

^不使用引用计数,至少不是唯一的。

^处理循环引用。因此,如果A^B,而B^A,并且没有其他人也有^,它们将被清理(最终)。

^也是垃圾的非确定性集电极。关于什么时候无法访问的对象将被清除,几乎没有保证。

shared_ptr是一个引用计数智能指针。当使用该引用计数块的每个shared_ptr达到零时,将执行删除操作。

如果你有Ashared_ptr<B>,并Bshared_ptr<A>回到A,那么这两个会很乐意永远存在。

在计划停机,如果删除操作清理过程中的内存资源,他们将被清理。如果删除操作执行其他操作,它将不会被调用(不需要手动打破循环)。

shared_ptr只是说,大家谁拥有它的副本对所涉的东西平等的所有权。当最后一位所有者放弃其权利时,此时将运行删除代码(几乎可以做任何事情)。因此,破坏是确定性的(如果在本地发生时确定有些棘手)。

对于内存立足资源优势,在对象一无所有的利息,除非内存,^风格的内存管理是不是太可怕了。但是,一旦你拥有不是内存(“更昂贵”,如文件句柄,网络连接,线程等)的资源,你不能随便让他们闲逛。

因此基于生命周期管理的^不再有效。

shared_ptr基于生命周期管理做得好一点,但它仍然不够理想,因为跟踪有效的资源泄漏(理想情况下资源寿命比理论上更长)仍然是共享生命周期所带来的痛苦。

unique_ptr以其单一责任点,可以更轻松地追踪事情的生命周期问题。

总之,^是伟大的,当你有几乎无限的资源,并不在乎如果他们泄漏了一段时间才清理。 shared_ptr当你对共享所有权有严格的理解(你明白谁应该分享所有权,谁应该拥有弱的所有权等)时,它是非常棒的。 unique_ptr和实际的基于价值的数据是最好的,当你实际拥有的生命周期应该得到很好的控制。

1

垃圾收集和引用计数是根本不同的技术。但是,比较C++/cli和C++,最重要的区别是阻止重新分配/销毁。使用GC你没有,没有(纯C++)你有(不管你是否使用共享指针)

相关问题