2013-02-11 2 views
1

Взято из блога Эрика Ганнерсона «virtual functions are not inlined», но что квалифицируется как виртуальный метод? MSDN определяет его как:.Являются ли методы переопределения виртуальными методами?

«Если объявление метода экземпляра включает в себя виртуальный модификатор, этот метод называется виртуальный метод Когда никакой виртуальный модификатор не присутствует, то способ называется не-виртуальный метод «. ? - MSDN Source

Строго говоря, производный класс с методом коррекции public override void SomeMethod(){} "не содержит слово virtual, так это могло быть встраиваемыми

Edit: В частности, речь идет ли перекрытый метод является кандидатом на inlining, поскольку две ссылки, которые я предоставил, слишком расплывчаты по методам переопределения.

+0

Вы не можете переопределить не виртуальный метод. Является ли метод виртуальным («может быть переопределен в подклассах») или нет, определяется в верхней части его цепочки наследования. (Дайте или возьмите уплотнение и повторное открытие, но я действительно не знаю всех краевых случаев этих модификаторов.) – millimoose

+0

@millimoose Можете ли вы привести источник? Это прямо противоположно тому, что говорится в статье MSDN. –

+0

См. [MSDN] (http://msdn.microsoft.com/en-us/library/ebca9ah3 (v = vs.71) .aspx) –

ответ

5

Из §1.6.6.4 Виртуальные, переопределенные и абстрактные методы спецификации C# 4.0 (вы цитировали более старую версию) :

Виртуальный метод может быть переопределен в производном классе. Когда объявление метода экземпляра включает модификатор override, метод переопределяет унаследованный виртуальный метод с той же сигнатурой. В то время как объявление виртуального метода представляет новый метод, объявление метода переопределения специализирует существующий унаследованный виртуальный метод, предоставляя новую реализацию этого метода.

Итак, когда вы пишете метод override, вы на самом деле не создаете новый метод, вы просто переопределяете метод. И это должно быть virtual, поэтому метод, который вы на самом деле вызываете, является виртуальным.

Это, как говорится, есть случаи, когда виртуальный метод может быть встроен: если тип времени компиляции рассматриваемого объекта равен sealed, то нет сомнений в том, какой код выполнить. (Я считаю, что .Net фактически не использует эту оптимизацию.)

Но в других случаях виртуальные методы не могут быть встроены.

+1

Что делать, если тип закрытого типа является типом значений? (Не риторический вопрос, я честно не знаю, изменил ли дрожание встроенные виртуальные методы типов значений. Я не вижу причин, почему это не могло.) –

+0

@EricLippert Не знаю, я основываю утверждение, что .Net не выполните эту оптимизацию на короткой ноте в [статье] (http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/aggressive-inlining-in-the-clr-4-5 -jit.aspx), я фактически не посмотрел на сгенерированный код сборки. – svick

0

Методы, которые переопределяют виртуальные методы, определенно являются виртуальными. Во многом это все тот же метод, что и тот, который они переопределяют. Они используют что-то, называемое vtable. Они указывают в блоге, что вы ссылаетесь на то, что компилятор будет оптимизировать то, что он может, но поскольку виртуальный/переопределенный метод имеет внешний вид, он не может быть упрощен.

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