.NET CLR运行时是否知道如何在运行时优化/内联简单属性getter?例如:
property int Length { get; set; }
一旦在运行时进行JIT,它会执行“Length__get”函数(为它构建堆栈,跳转执行代码等)吗?或者抖动是否聪明,并且知道这可以被重写为类字段访问?
答案 0 :(得分:13)
是的,CLR将在“正常”情况下进行内联。但是在某些情况下,内联不会发生 - 包括从MarshalByRefObject
派生的任何内容(因为它可能是运行时代理)。
内联内容的规则取决于您使用的确切CLR - x64 vs x86,版本等。尽管如此,琐碎的属性很可能被内联:)
(由于某些原因,我看到一个简单的属性比过去的双打字段访问要慢......对于大于本机字大小的值,可能存在一些限制。)
答案 1 :(得分:7)
在.Net 2.0中,如果方法(包括属性getter / setter)少于32个字节,则会内联它们。
.Net 3.5 JIT'r更加智能,所以它取决于。它可以 内联它。
有关此问题的一些讨论,请参阅To Inline or not to Inline: That is the question。