加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – .Net Framework 4.0 – Opcodes.Box在Dictionary中出现,带

发布时间:2020-12-15 08:17:02 所属栏目:百科 来源:网络整理
导读:我正在尝试调查带有枚举键的字典是否仍然在较新版本的.Net中生成垃圾(比如 = 4) 请参阅Shawn Hargreaves博客文章,了解为何我甚至为此烦恼…… (http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx) 非常具
我正在尝试调查带有枚举键的字典是否仍然在较新版本的.Net中生成垃圾(比如> = 4)

请参阅Shawn Hargreaves博客文章,了解为何我甚至为此烦恼……
(http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx)
非常具体我知道但是xbox上的垃圾是/可能是一个非常棘手的问题.

我创建了一个小的.Net v4控制台应用程序,比较为Dictionary和Dicationary生成的IL,并注意到两组代码中的“盒子”操作码,这让我很困惑.

.method private hidebysig 
    instance int32 FindEntry (
        !TKey key
    ) cil managed 
{
    // Method begins at RVA 0x61030
    // Code size 138 (0x8a)
    .maxstack 3
    .locals init (
        [0] int32,[1] int32
    )

    IL_0000: ldarg.1
    IL_0001: box !TKey   <----Hmmmm!
    IL_0006: brtrue.s IL_000e

    IL_0008: ldc.i4.5
    IL_0009: call void System.ThrowHelper::ThrowArgumentNullException(valuetype System.ExceptionArgument)

    IL_000e: ldarg.0
    IL_000f: ldfld int32[] class System.Collections.Generic.Dictionary`2<!TKey,!TValue>::buckets
    IL_0014: brfalse.s IL_0088

https://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.box%28v=vs.110%29.aspx

Convert a value type (of the type specified in valTypeToken) to a true
object reference.

这里的盒子不是堆分配吗?如果没有,那么我怎么知道何时存在可能导致Xbox崩溃的堆分配?(从查看IL)它是否依赖于其他一些上下文?
内存分析器(例如CLR Profiler)是唯一可以确定的方法吗?

解决方法

是的,它是一个盒子,但在这种情况下不应该没关系 – 至少,不适用于常规的.NET;这是一个!= null检查; JIT知道如何识别值类型,并可以从机器代码中删除该检查.

据称.

要确定,你需要查看post-JIT机器代码,而不是IL.

你正在使用哪种JIT也很重要,这使得它变得更难.

最坏的情况:您可以使用CoreCLR代码来滚动您自己的值类型字典.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读