Наличие хотя бы одного виртуального метода в классе C ++ (или любом из его родительских классов) означает, что класс будет иметь виртуальную таблицу, и каждый экземпляр будет иметь виртуальный указатель.
Так что стоимость памяти вполне понятна. Самым важным является стоимость памяти для экземпляров (особенно, если экземпляры небольшие, например, если они предназначены только для целого числа: в этом случае наличие виртуального указателя в каждом экземпляре может удвоить размер экземпляров. пространство памяти, используемое виртуальными таблицами, я думаю, обычно незначительно по сравнению с пространством, используемым фактическим кодом метода.
Это подводит меня к моему вопросу: есть ли измеримые затраты на производительность (то есть влияние на скорость) для создания виртуального метода? Поиск в виртуальной таблице будет производиться во время выполнения при каждом вызове метода, поэтому, если есть очень частые вызовы этого метода, и если этот метод очень короткий, то может быть ощутимое снижение производительности? Я думаю, это зависит от платформы, но кто-нибудь запускал тесты?
Причина, по которой я спрашиваю, заключается в том, что я обнаружил ошибку, которая произошла из-за того, что программист забыл определить виртуальный метод. Я не первый раз вижу такую ошибку. И я подумал: зачем мы добавляем ключевое слово virtual, когда это необходимо, вместо удаления ключевого слова virtual, когда мы абсолютно уверены, что оно не нужно? ? Если затраты на производительность невелики, я думаю, что просто порекомендую в своей команде следующее: просто сделайте каждый метод виртуальным по умолчанию, включая деструктор, в каждом классе, и удаляйте его только тогда, когда вам нужно . Для вас это звучит безумно?