C# 比较共享ptr与托管语言引用 P>可以解释C++程序员最重要的区别java和C++之间的引用和SysDypPTR(从Boost或C++ 0x)。

C# 比较共享ptr与托管语言引用 P>可以解释C++程序员最重要的区别java和C++之间的引用和SysDypPTR(从Boost或C++ 0x)。,c#,java,c++,C#,Java,C++,我或多或少知道共享ptr是如何实现的。我对以下方面的差异感到好奇: 1) 表演。 2) 骑自行车。共享的ptr可以循环(A和B彼此保持指针)。在Java中可以循环吗? 3) 还有别的吗 谢谢。关键区别在于,当共享指针的使用计数变为零时,它指向的对象将立即被销毁(调用析构函数并释放对象)。在Java和C#中,对象的释放被推迟,直到垃圾收集器选择释放对象(即,它是非确定性的) 关于周期,我不确定我是否理解你的意思。在Java和C#中,两个对象包含相互引用的成员字段是很常见的,因此创建了一个循环。例如

我或多或少知道共享ptr是如何实现的。我对以下方面的差异感到好奇:

1) 表演。 2) 骑自行车。共享的ptr可以循环(A和B彼此保持指针)。在Java中可以循环吗? 3) 还有别的吗


谢谢。

关键区别在于,当共享指针的使用计数变为零时,它指向的对象将立即被销毁(调用析构函数并释放对象)。在Java和C#中,对象的释放被推迟,直到垃圾收集器选择释放对象(即,它是非确定性的)


关于周期,我不确定我是否理解你的意思。在Java和C#中,两个对象包含相互引用的成员字段是很常见的,因此创建了一个循环。例如汽车和发动机-汽车通过发动机字段引用发动机,发动机可以通过汽车字段引用汽车。

性能
共享的ptr性能相当好,但根据我的经验,其效率略低于显式内存管理,主要是因为它是引用计数的,并且引用计数也必须分配。它的性能取决于许多因素,与Java/C垃圾收集器相比,它的性能如何只能根据每个用例来确定(取决于语言实现和其他因素)

循环仅在
弱ptr
的情况下才可能进行,而不是在两个
共享ptr
的情况下。Java允许循环,无需进一步ado;它的垃圾收集器将自动运行。我猜C#也是这样


其他任何内容:共享\u ptr
指向的对象在最后一次引用超出范围时立即销毁。析构函数立即被调用。在Java中,可能不会立即调用终结器。我不知道C是如何在这一点上运行的。

具有C++引用计数指针的循环引用将不会被处理。您可以使用弱指针来解决此问题。Java或C#中的循环引用可能会在垃圾收集器认为合适时被释放


当C++引用中的计数计数指针降至零时,调用析构函数。当Java对象不再可访问时,可能不会立即或永远调用其终结器。因此,对于需要显式处理外部资源的对象,需要某种形式的显式调用

首先,Java/C只有指针,没有引用,尽管他们这样称呼它们。引用是一个独特的C++特性。Java/C中的垃圾收集基本上意味着无限的生命周期<另一方面,当计数变为零时,代码>共享\u ptr提供共享和确定性销毁。因此,
shared_ptr
可用于自动管理任何资源,而不仅仅是内存分配。在某种意义上(就像任何RAII设计一样),它将指针语义转换为更强大的值语义。

没有人指出通过托管内存中的内存管理器移动对象的可能性。因此,在C#中没有简单的引用/指针,它们就像描述管理器返回的对象的ID一样工作。

在C++中,由于SyrdypTR不能创建这个,因为对象在创建后仍在同一个位置。

C语言和java中没有“正常”析构函数,它们只有有限元,这被认为是这些语言的一个错误特性。析构函数和垃圾回收不一致。GC的基本意思是:没有破坏,或者无限的对象生命周期。在函数中调用的析构函数的概念和对象的破坏,比如对象的释放,是有区别的。我知道这常常会混淆,因为这两个事件都使用相同的术语,所以也许对象的分配将是更好的选择词来指代以后的事件。破坏不是解除分配,它们是非常不同的概念,不应该互换使用。C++与“引用”的区别对那种语言来说是非常特殊的。C#/Java引用介于两者之间,因为你不能对它们进行指针运算。@larsmans,问题是Java在语义上不仅有指针,而且只有指针。它缺少一种保证引用永远不为空的引用机制。但是它实际上没有指针算术,而表面语法标记不是通常的指针注释。但是,你所说的是误导性的,因为它假定C++定义了什么是“引用”。Java有引用,因为它们被称为引用。他们的行为不像C++参考。问题是两种不同的语言对同一个词的含义不同。它的含义是特定于语言的上下文的(不幸的是,初级开发人员不明白这一点,他们在切换语言时认为同一个词意味着同一件事)。我认为吉恩在正确的轨道上,他只需要稍微重述一下答案。看看不同语言中local的含义(C/C++/Java/C#中的一个局部变量与perl的转换相对类似,在这种情况下,local具有全新的含义)。注意性能,如果使用
make_shared
(),则引用计数和引用对象都分配在一个块中。可以说,
shared_ptr
对性能的最大影响是ref的联锁增量/减量counter@sbk当前位置你为什么认为这是一个性能热门。它通常作为一条汇编指令来实现(不需要对支持它的硬件进行锁定)。@LokiAstari在我使用的应用程序中(该应用程序大量使用共享线程),联锁inc/dec占tot的14%