gpt4 book ai didi

c# - CLR 会优化和内联这个 GetHashCode() 吗?

转载 作者:行者123 更新时间:2023-11-30 14:18:58 24 4
gpt4 key购买 nike

假设我们有一个这样的值类型,其中的字段是readonly 并在构造期间初始化:

public struct SomeValue
{
private readonly Int32 field1;
private readonly Int32 field2;

...
}

此外,假设我们有一个辅助类,它允许我们以可重用的方式为复合类型实现 GetHashCode():

public struct SomeValue
{
...

public override Int32 GetHashCode()
{
return HashHelpers.GetHashCode(this.field1, this.field2);
}
}

现在,编译器必须意识到字段值在构造类型后永远不会更改,因为它们是只读。因此,当 SomeValue.GetHashCode() 是 JIT 时,对 HashHelpers.GetHashCode() 的调用是否可能会以某种方式内联?

最佳答案

您没有发布 HashHelper 方法的代码,但由于它应该又小又快,是的,它很可能会被内联。

而且,是的,JIT 优化器非常有能力在编译时评估表达式并用简单的常量值替换代码。但是当您使用readonly 成员时,这不会发生。因为它所具有的值是由构造函数决定的。优化器不会考虑其他方法中的代码来猜测该字段是否具有已知值。它必须能够在编译 GetHashCode 时检测到该值。

如果您使用 const 来初始化只读字段,您可以得到这个。并在 GetHashCode 实现中使用相同的常量。那太丑了。鉴于您将从这种微优化中获得的好处非常有限,这可能不是您应该考虑的事情。可能的胜利不会超过一纳秒左右。但很可能为零,因为优化器会用 mov 替换 xor。

关于c# - CLR 会优化和内联这个 GetHashCode() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3667747/

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