gpt4 book ai didi

.NET 4.0 Dictionary : Value type key boxed for a futile 'null' check. 这会损害性能吗?

转载 作者:行者123 更新时间:2023-12-02 12:50:09 25 4
gpt4 key购买 nike

例如:

.method private hidebysig instance void Insert(!TKey key, !TValue 'value', bool add) cil managed
{
.maxstack 3
.locals init (
[0] int32 num,
[1] int32 num2,
[2] int32 num3,
[3] int32 num4)
L_0000: ldarg.1
L_0001: box !TKey
L_0006: brtrue.s L_000e
L_0008: ldc.i4.5
L_0009: call void System.ThrowHelper::ThrowArgumentNullException(valuetype System.ExceptionArgument)

这来自 .NET 4.0 中 Dictionary 的内部 Add 方法。尽管泛型被广泛吹捧为有助于避免值类型装箱,但为什么这个系统组件会对值类型键的每个操作进行这种低效的检查?如果我理解正确的话,这不仅会损害性能,而且总是会返回 true (装箱值类型永远不会是空引用)

编辑:Marc对此特定问题的回答摘要:重要的原因是此 Dictionary 实现选择禁止使用“null”Nullable 实例作为键。由于 MSIL 框指令对 Nullable 值类型进行了特殊处理,因此检查不一定对所有值类型都是无效的。

最佳答案

一个Nullable<T>struct/值类型,可以是null (取决于您对 null 的定义;但它当然可以装箱null )。并非全部TKey是值类型( string 可能是最常见的 TKey )。

这里要求key不为null;所以它确实需要验证这一点。

事实上,拳击并不像人们想象的那么糟糕;即使装箱,也会被 gen-0 收集。它可以通过泛型实现特殊情况(就像 EqualityComparer<T> 那样 - 通过一些不同的子类),但这似乎有点过分了。

JIT也许也能够删除空检查。我在这里说可能,因为尽管这经常被引用,但我见过空检查超出 JIT 删除能力的情况。

关于.NET 4.0 Dictionary<TKey,TValue> : Value type key boxed for a futile 'null' check. 这会损害性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4343133/

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