.NET CLR是否自动内联属性?

时间:2009-07-27 13:23:26

标签: .net clr

.NET CLR运行时是否知道如何在运行时优化/内联简单属性getter?例如:

property int Length { get; set; }

一旦在运行时进行JIT,它会执行“Length__get”函数(为它构建堆栈,跳转执行代码等)吗?或者抖动是否聪明,并且知道这可以被重写为类字段访问?

2 个答案:

答案 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