Есть ли способ убедиться, что функции-члены являются виртуальными в D? - PullRequest
6 голосов
/ 15 апреля 2009

Насколько я понимаю, все функции-члены являются виртуальными в D, но компилятор может делать функции не виртуальными, если видит, что они никогда не переопределяются.

Что мне неясно, так это то, что происходит, когда вы компилируете модуль, в котором функции-члены не переопределяются, а затем импортируете этот модуль куда-то еще, где вы переопределяете функцию-член. Я не думаю, что он перекомпилирует оригинальный модуль. Это просто предполагает, что любая функция-член с внешней связью является виртуальной?

Ответы [ 4 ]

5 голосов
/ 15 апреля 2009

Все функции-члены D по умолчанию являются виртуальными. Я не думаю, что есть какие-то компиляторы, которые фактически делают функции не виртуальными в качестве оптимизации. Вы можете сделать это вручную, пометив класс или функцию как "final".

2 голосов
/ 24 июля 2012

Как это реализовано, зависит от компилятора и компоновщика. Но одна распространенная ситуация, когда вызовы виртуальных функций могут быть оптимизированы, это когда у вас есть экземпляр класса, созданный локально. Тогда вызовы функций могут выполняться непосредственно в этой области, поскольку тип класса полностью известен во время компиляции. Это можно сделать на уровне компилятора.

Кроме того, если компоновщик понимает, что реализация функции никогда не отменяется, тогда компоновщик может выполнить оптимизацию и заменить вызовы виртуальных функций прямыми вызовами функций в этом классе. В частности, если класс никогда не является производным, все вызовы функций-членов могут выполняться напрямую. Это как если бы компоновщик вставлял ключевое слово 'final' везде, где это возможно. (Компоновщик может не применять эту оптимизацию к экспортируемым классам и функциям, поскольку компоновщик не знает, переопределены ли функции в других библиотеках или исполняемых файлах.)

2 голосов
/ 16 апреля 2009

FeepingCreature в основном корректен, за исключением шаблонных функций, которые нельзя сделать виртуальными.

1 голос
/ 15 апреля 2009

Я считаю, что FeepingCreature является правильным, но, кроме того, я думаю, вы можете предположить, что такие оптимизации будут учитываться только компилятором, если он непосредственно создает исполняемый файл из исходных кодов.

...