为啥托管语言的GC不在方法结束时立即销毁该方法内new的临时对象(程序员可确定该对象不会被引用)
鬼知道你这个对象有没有被别人引用啊鬼知道你会不会把一个被引用了的对象delete掉啊通常非常及时地释放内存并没有很显著的好处,只要足够及时就可以了
■网友
方法结束时立即销毁该方法内new的临时对象这不就是引用计数嘛。 C++中智能指针不就是这么做的嘛。
■网友
首先,是的,GC是集中处理的。1. 因为GC要先暂停所有线程,这个操作开销是很大的。你随便退出一个方法就要启动GC来分析临时对象,那岂不是慢死了。2. 首先假设你设计的方法要启动标准GC的过程,那么否定它的理由就和上一条一样,效率太低。假如你设计的方法不通过标准GC,则失去了安全性。这违反了托管语言的设计原则,变得跟C++一样了。
■网友
1. 因为不分析的话不会知道那个对象是不是被别的长周期对象引用,而分析的话就是启动GC了。2. 因为那样GC次数会多很多啊,而且并不会带来任何好处,不要觉得自己比GC聪明。
■网友
感谢各位答主的回答。不过依然无法打消我心中的念头,另外我也阅读了一些材料,虽然题主因水平有限无法从更高的角度来看这个问题(这也是来提问的原因),不过还是来自问自答一下。------------------------------------------------------------------------------------------------------------------------------------------我想说,题目中的这个想法也许并没有各位答主想的那么弱智或者无聊,待我详细解释一下。该问题的本质其实就是:【在含有gc的托管语言中为了追求性能而加入“手动删除对象”的支持究竟有没有意义】可讨论的点有如下几个:0.含有gc的托管语言是不是就应该必须在绝对安全、自动回收垃圾对象的前提下再保证运行效率,可以引申为如“你都用java/C#了还在乎效率干什么”或者“你为什么不用C++呢”等问题1.加入该功能会不会破坏安全性,以及能被多大程度的破坏;如果程序员能不困难的正确的使用它又如何(参考C#的unsafe)2.假设加入了该功能,那么对于某些场景的性能提升究竟有多大,和为加入该功能而付出的代价相比究竟值不值得。可以参阅roslyn的一个issue:State / Direction of C# as a High-Performance Language · Issue #10378 · dotnet/roslyn,其中包含若干为了性能而不那么安全的feature的讨论,比如:Ref returns / ref locals(这一条已经在C#7中完全实现了,vs2017即可体验)Generic API for unsafe read / writeEfficient unmanaged memory operationsHandling overlapped explicit FieldOffsets in structsExtended unsafe genericsPrimitiveValueType and Generic PointersCustom memory allocationsHeap objects with custom allocator and explicit delete其中倒数第二条:Custom allocators - (size, disposal, etc). · Issue #1235 · dotnet/coreclr【手动分配堆内存】倒数第一条:Heap objects with custom allocator and explicit delete · Issue #4365 · dotnet/coreclr【堆对象的custom allocator和显式delete】(类似于题主的问题2), 这个提议已经被coreclr组标成了Future(应该是以后会仔细讨论的意思)。虽然clr组曾经有的提议讨论讨论着就无疾而终了(逃。但这起码也说明了这个提议是有意义的。最后,其实也不必对托管语言持有偏见,认为"必须保证100%安全、性能不是最重要的、托管语言就这么设计的“,像这样:"game development... has a habit of gladly abandoning the usual ways of safe code design for that 0.1% of the bottleneck code in favor of maximum efficiency. Unfortunately, there are cases where C# gets in the way of that last bit of optimization."C# gets in the way because that\u0026#39;s what it was designed to do.If you want to write code that disregards correctness in favour of performance, you should be writing that code in a language that doesn\u0026#39;t enforce correctness (C/C++), not trying to make a correctness-enforcing language less so. Especially since scenarios where performance is preferable to correctness, is an extremely tiny minority of C# use cases.有人这样回应:that\u0026#39;s a very narrow view of C#. There are languages like Rust that try to maximize correctness without run-time overhead, so it\u0026#39;s not one vs the other. While C# is a garbage-collected language by design, with all the benefits and penalties that it brings, there\u0026#39;s no reason why we cannot ask for performance-oriented improvements, like cache-friendly allocations of collections of reference types or deterministic deallocation, for example. Even LOB applications have performance bottlenecks, not just computer games or science-related scripts.Are you saying that unsafe does not exist? C# had that from the start and it\u0026#39;s exactly for that small amount of code where you\u0026#39;ll willing to sacrifice safety for performance.
推荐阅读
- “空壳村”土地撂荒何解?山西石楼加码农地托管促农业提档升级
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- OC为何跌出语言榜前十
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
