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