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

.net NET CLR是否自动内联属性?,.net,clr,.net,Clr,.NET CLR运行时是否知道如何在运行时优化/内联简单属性获取程序?例如: property int Length { get; set; } 在运行时JIT完成后,是否会执行“Length\uuu get”函数(为其构建堆栈、跳转以执行代码等)?或者抖动是智能的,并且知道这可以被重写为类字段访问吗?是的,在“正常”情况下,CLR将内联它。但是,在某些情况下不会进行内联,包括从MarshallByRefObject派生的任何内容(因为它可能是运行时代理) 内联的规则取决于您使用的确切CLR-

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

property int Length { get; set; }

在运行时JIT完成后,是否会执行“Length\uuu get”函数(为其构建堆栈、跳转以执行代码等)?或者抖动是智能的,并且知道这可以被重写为类字段访问吗?

是的,在“正常”情况下,CLR将内联它。但是,在某些情况下不会进行内联,包括从
MarshallByRefObject
派生的任何内容(因为它可能是运行时代理)

内联的规则取决于您使用的确切CLR-x64 vs x86,版本等。琐碎的属性内联的可能性与您得到的一样:)

(由于某些原因,我在过去看到一个普通属性比double的字段访问速度慢……对于大于本机单词大小的值可能会有一些限制。)

在.Net 2.0中,如果方法(包括属性getter/setter)的字节数少于32,则会将其内联

NET3.5JIT'r更智能一些,这取决于它。它当然可以将其内联


有关这方面的一些讨论,请参阅。

好链接。Vance Morrison详细讨论了.NET 3.5中哪些是内联的,哪些不是内联的。有趣的是,由于一级缓存未命中,更多代码(通过内联生成)执行速度较慢。@Jon,你说的“值大于本机字长”是什么意思?我指的是32位处理器上的长代码或双代码(每个代码都是64位)。