Предположим, у меня есть абстрактный класс и класс, который его реализует.При использовании абстрактных классов в 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
, или оба, или же атрибут не работает в этом случае?
Внутренний() не может быть встроен, он абстрактный. Это всегда требует виртуального вызова конкретного метода реализации, реализованного как косвенный вызов, хотя и в таблице методов. Встраивание возможно только тогда, когда джиттер знает, какой вызов будет выполнен в течение времени, прежде чем запуск кода начнется. –