![]() |
1
11
其中一个原因 我 找到令人信服的是一致性。如你所说,Java 做 缓存一定范围内的装箱值。。。这意味着写代码太容易了 一段时间 :
我已经被这个咬了一口——当然,幸运的是,这是在一个测试中而不是在生产代码中,但是有一些东西在给定的范围之外显著地改变了行为,这仍然是令人讨厌的。 别忘了,任何有条件的行为也要付出代价 全部的 拳击操作——所以在不使用缓存的情况下,你会发现它是比较慢的(因为它首先必须检查是否使用缓存)。 当然,如果您真的想编写自己的缓存框操作,可以这样做:
然后像这样使用:
|
![]() |
2
3
我不能说我能读心术,但有几个因素: 1)缓存值类型可以使 不可预测性 -根据缓存命中率和实现,比较两个相等的装箱值可能为真或假。哎哟! 2)装箱值类型的生存期很可能很短—那么您在缓存中保存该值多长时间?现在,您要么拥有大量不再使用的缓存值,要么需要使GC实现更加复杂,以跟踪缓存值类型的生存期。 有了这些不利因素,潜在的胜利是什么?应用程序中有很多相同类型的长寿命的小的内存占用。既然这场胜利会影响到一小部分应用程序,而且可以通过修改代码来解决,我同意c规范编写者的决定。 |
![]() |
3
3
装箱值对象不一定是不可变的。可以更改盒装值类型中的值,例如通过接口。 因此,如果装箱一个值类型总是基于相同的原始值返回相同的实例,它将创建可能不合适的引用(例如,两个不同的值类型实例,它们碰巧具有相同的值,即使它们不应该以相同的引用结束)。
生成此输出:
如果装箱没有创建新的实例,那么BOXDE1和BOXED2将具有相同的值,如果它们是由不同的原始值类型实例创建的,那么这将是不合适的。 |
![]() |
4
1
有一个简单的解释:un/拳击是 快速的 . 它需要在.NET 1.x天内返回。在JIT编译器为它生成机器代码之后,只为它生成了少量的CPU指令,这些指令都是内联的,没有方法调用。不包括可空类型和大型结构之类的角案例。 查找缓存值的工作将大大降低此代码的速度。 |
![]() |
5
0
我不认为运行时填充缓存是一个好主意,但我认为在64位系统上,将64个可能的对象引用值中的80亿定义为整数或浮点数,以及在任何系统预选框上,将所有原始文本都定义为整数或浮点数可能是合理的。测试引用类型的上31位是否包含某些值可能比内存引用便宜。 |
![]() |
6
0
除了已经列出的答案之外,事实上在.net中,至少在普通垃圾收集器中,对象引用在内部存储为直接指针。这意味着在执行垃圾收集时,系统必须更新对每个移动对象的每个引用,但这也意味着“主线”操作可能非常快。如果对象引用有时是直接指针,有时是其他指针,则每次取消引用对象时都需要额外的代码。由于对象解引用是.net程序执行过程中最常见的操作之一,因此,如果没有惊人的加速,即使是5%的速度减慢也将是毁灭性的。例如,可能是一个“64位紧凑”模型,其中每个对象引用是一个32位索引到对象表中,它可以提供比现有模型中更好的性能,其中每个引用是64位直接指针。延迟操作将需要额外的表查找,这将是不好的,但对象引用将更小,从而允许将更多的表同时存储在缓存中。在某些情况下,这可能是一个重大的业绩胜利(也许经常是值得的——也许不是)。不过,现在还不清楚,允许对象引用有时是直接的内存指针,有时是其他东西,是否真的能提供很多好处。 |
![]() |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
![]() |
yurnero · MATLAB:“加载”一个快速访问功能 6 年前 |
![]() |
joe · 一页可以同时在两个工作集中吗? 6 年前 |
![]() |
Jaques · “.exe”已触发断点 6 年前 |
![]() |
adn bps · 在函数中修改变量的高效内存方法 6 年前 |
![]() |
Gauraang Khurana · C语言中分段错误的不稳定行为 6 年前 |
![]() |
Rajesh K · 如何查找设备中存在的广告垃圾? 6 年前 |