2017-02-12 5 views
0

Предположим, у меня есть абстрактный класс и класс, который его реализует.При использовании абстрактных классов в C#, делает ли AgressiveInlining что-нибудь и где его следует поместить?

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() быть inline'd с помощью [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 
    } 
} 

идти ли этот атрибут в BaseClass, MyClass, или оба, или же атрибут не работает в этом случае?

+2

Внутренний() не может быть встроен, он абстрактный. Это всегда требует виртуального вызова конкретного метода реализации, реализованного как косвенный вызов, хотя и в таблице методов. Встраивание возможно только тогда, когда джиттер знает, какой вызов будет выполнен в течение времени, прежде чем запуск кода начнется. –

ответ

1

Замечание Перса, абстрактные члены не могут быть inline'd из-за природы абстрактных классов и виртуальных вызовов.

Редактировать: на комментарий Бена ниже, это не так, как правило, для всех компиляторов, но это справедливо для JIT (что оказалось в контексте моего конкретного вопроса).

+1

Это неправда, девиртуализация - это хорошо известная оптимизация. Это просто оптимизация, которую .NET JIT не реализует в этом сценарии. –

Смежные вопросы