我正在编写编译器,这个编译器的一个特性是它自动为值类型生成GetHashCode(),Equals(object)和Equals({this value type})方法。现在,Equals({this value type})实现基本上生成il等效于此c#生成的il:
public bool Equals(ThisType o)
{
return Field1 == o.Field1 && Field2 == o.Field2 && Field3 == o.Field3;//etc
}
我的编译器将所有这些对象推送到堆栈,然后开始比较并“和”它们在一起。这会导致方法的.maxstack变得非常快。对此有处罚吗?如果是这样,我应该在什么时候开始将价值推向当地人?
感谢。
答案 0 :(得分:2)
为什么不测量对您很重要的情景并找出答案?在.NET版本或处理器体系结构中,您的性能可能会有所不同,因此您真的需要测量您关心的变体。据我了解,maxstack
主要用于验证,所以我会猜测不会有太多的性能损失,但唯一可以确定的方法是实际测量
此外,在您的情况下,您不需要任何本地人来避免增加堆栈,无论如何。你可以做这样的事情:
load Field1
load o.Field1
branch to end if not equal
load Field2
load o.Field2
branch to end if not equal
...
return true
end:
return false
无论字段数如何,都使用常量堆栈空间。