在 C# 中使用抽象类时,AgressiveInline 是否执行任何操作,以及应将其放置在何处



假设我有一个抽象类和一个实现它的类。

public abstract class BaseClass
{
    public void Outer()
    {
        for (int i = 0; i < 1000000; i++)
        {
            Inner();
        }
    }
    protected abstract void Inner();
}
public class MyClass : BaseClass
{
    protected override void Inner()
    {
        // do stuff
    }
}

由于Outer()调用Inner()太多并且几乎没有其他作用,因此我希望Inner()内联使用[MethodImpl(MethodImplOptions.AggressiveInlining)]

public abstract class BaseClass
{
    public void Outer() // ...
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    protected abstract void Inner();
}
public class MyClass : BaseClass
{
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    protected override void Inner()
    {
        // do stuff
    }
}

此属性是BaseClassMyClass 或两者兼而有之,还是在这种情况下该属性根本不有效?

根据Hans的评论,由于抽象类和虚拟调用的性质,抽象成员不能内联。

编辑:根据Ben下面的评论,这通常不适用于所有编译器,但对于JIT也是如此(这恰好是我特定问题的上下文(。

最新更新