gpt4 book ai didi

c# - .Net Framework 4.0 - Opcodes.Box 出现在带有 int 键的字典中

转载 作者:太空狗 更新时间:2023-10-29 21:22:05 26 4
gpt4 key购买 nike

我正在尝试调查带有枚举键的字典是否仍然在较新版本的 .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 知道如何识别这些值类型,并且可以从机器代码中删除该检查。

据称。

为了确定,您需要查看后 JIT 机器代码,而不是 IL。

您使用的 JIT 也很重要,这会使其变得更加困难。

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

关于c# - .Net Framework 4.0 - Opcodes.Box 出现在带有 int 键的字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30118713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com