Cyg*_*gon 6 .net boxing garbage-collection
我想知道在对象中装入一个值类型是否是一种特殊情况,或者在删除对它的任何引用后,由.NET构造的"框"是否变为垃圾(GC必须收集).
例如,StringBuilder.AppendFormat()具有以下重载:
StringBuilder.AppendFormat(string format, object arg0);
StringBuilder.AppendFormat(string format, object arg0, object arg1);
StringBuilder.AppendFormat(string format, object arg0, object arg1, object arg2);
StringBuilder.AppendFormat(string format, params object[] args);
Run Code Online (Sandbox Code Playgroud)
对于具有3个或更少参数的调用具有这些额外的重载可能表明装箱确实是一种特殊情况(或者从性能观点来看,它是值得的,以避免阵列构造).
从理论上讲,使用普通的旧引用计数,可能带有可重用框的池将是一个有效的实现,因为不能从一个框到另一个框的引用,只能从.NET对象到框.
首先,只是为了澄清:创建一个对象引用数组不是装箱."拳击"这个术语在.NET中具有非常特殊的含义,我认为值得坚持下去.
拳击确实创造了垃圾 - 或者更确切地说,每次你装箱时,它会创造一个新的物体,最终可能变成垃圾.(它不具备成为垃圾-你可能需要的是对象的应用程序的生命周期的其他部分的引用;它只是非常罕见的.)
但是,你可以有一个缓存用于拳击目的.实际上,Java确实适用于少数人.如果你写:
Integer x = 5;
Integer y = 5;
System.out.println(x == y); // Reference comparison
Run Code Online (Sandbox Code Playgroud)
然后保证打印true
.
但是,这只是一组固定类型的小缓存 - 它不是通用缓存.你需要平衡一般缓存与弱引用的痛苦(不是引用计数 - 在.NET中的GC机制不是引用计数,而你实际上不能仅仅为盒装值引入)几乎肯定会损害性能超过拳击创造垃圾的小成本.
.NET本可以采用与Java相同的方法,并加入某些类型的某些值,但我不确定它是否值得额外的概念包袱 - 特别是当平台支持自定义值类型(Java没有)时.
值得注意的是,自从.NET 2.0以来,拳击比以前更为罕见.它在数据绑定和反射中发生了相当大的数量,但现在在普通的旧数据操作中不太常见.
归档时间: |
|
查看次数: |
1134 次 |
最近记录: |