CSharpUser Asked:2020-12-22 03:25:07 +0000 UTC2020-12-22 03:25:07 +0000 UTC 2020-12-22 03:25:07 +0000 UTC C#/JIT 编译器上下文中的内联术语 772 下午好。 我遇到了这样一个问题,即我想在C#的上下文中分别清楚地理解诸如内联方法之类的术语的定义(以便“内联方法”之类的问题消失)。 问题的第二部分,为什么JIT编译器优于内联方法? c# 1 个回答 Voted Best Answer VladD 2020-12-22T04:09:16Z2020-12-22T04:09:16Z 在 C# 的上下文中,据我所知,inline-substitution 意味着编译时优化,其中被调用方法的主体被内联到调用函数中而不是被调用。目前,只有 JIT 编译器参与了此类优化。 在 C# 中,您不能强制编译器内联一个函数,但您可以使用[MethodImpl(MethodImplOptions.AggressiveInlining)]. 您还可以通过指定[MethodImpl(MethodImplOptions.NoInlining)]. 相反,在 C++ 中,关键字inline意味着汇编器必须忽略一个函数在不同编译单元中被多次定义的事实(从而削弱了 ODR)。 关于问题的第二部分:C# 中的内联由 JIT 编译器处理,因为它确切地知道目标平台。JIT 编译器决定是否内联给定函数的确切标准因版本而异。 根据这篇文章,方法是: 标有属性MethodImplOptions.NoInlining IL 代码的大小大于 32 字节(在没有属性的情况下MethodImplOptions.AggressiveInlining) 虚拟方法 以大值类型为参数的方法 派生自的类中的方法MarshalByRefObject 具有复杂控制流程的方法 例如递归方法 和异常处理方法 带有奇异指令、安全检查等的方法。 这是 JIT 编译器关于内联方法的“首选项列表”。 当然这个列表不是最终的,会在后续的版本中进行修改(朝弱化的方向)。
在 C# 的上下文中,据我所知,
inline-substitution 意味着编译时优化,其中被调用方法的主体被内联到调用函数中而不是被调用。目前,只有 JIT 编译器参与了此类优化。在 C# 中,您不能强制编译器内联一个函数,但您可以使用
[MethodImpl(MethodImplOptions.AggressiveInlining)]. 您还可以通过指定[MethodImpl(MethodImplOptions.NoInlining)].相反,在 C++ 中,关键字
inline意味着汇编器必须忽略一个函数在不同编译单元中被多次定义的事实(从而削弱了 ODR)。关于问题的第二部分:C# 中的内联由 JIT 编译器处理,因为它确切地知道目标平台。JIT 编译器决定是否内联给定函数的确切标准因版本而异。
根据这篇文章,方法是:
MethodImplOptions.NoInliningMethodImplOptions.AggressiveInlining)MarshalByRefObject这是 JIT 编译器关于内联方法的“首选项列表”。
当然这个列表不是最终的,会在后续的版本中进行修改(朝弱化的方向)。