在 C# 中,您可以将
[MethodImpl(MethodImplOptions.AggressiveInlining)]
属性应用于任何方法,以确保 JIT 在大多数地方内联调用它(而不是依赖启发式识别短方法)。 何时应该应用它是有争议的,但现代 .NET 通常本身就做得足够好,因此该属性不是必需的。 (遗憾的是我一直在使用 .NET Framework。)
我很好奇它是否对终结器(析构函数,
~TypeName() {}
)有任何影响,因为它们可以采用适用于AttributeTargets.Method
的任何属性,包括[MethodImpl]
。从文档中,我了解到 GC 会调用类继承链上的每个 Finalize
实现 — 这些调用是否符合内联条件?我并不认为如果是这样的话,它会产生明显的变化。
[MethodImpl(MethodImplOptions.AggressiveInlining)]
用于 JIT 编译器,对 Finalizers
的调用不是从 JIT 编译的代码(运行时的非托管部分)发起的。所以,从逻辑上讲,它不应该有任何影响。
但即使是这样,我也会假设运行它们的代码类似于:
foreach(var finalizer in finalizers){
finalizer(); // inline here?
}
你会如何内联它?