Наявність хоча б одного віртуального методу в класі C ++ (або будь-якого з його батьківських класів) означає, що у класу буде віртуальна таблиця, і кожен екземпляр матиме віртуальний покажчик.
Тож вартість пам'яті цілком зрозуміла. Найважливішою є вартість пам'яті для екземплярів (особливо якщо екземпляри невеликі, наприклад, якщо вони просто призначені для містять ціле число: у цьому випадку наявність віртуального вказівника у кожному екземплярі може подвоїти розмір примірників. Що стосується простір пам'яті, що використовується віртуальними таблицями, я думаю, що це зазвичай незначно порівняно з простором, який використовується фактичним кодом методу.
Це підводить мене до мого питання: чи є вимірна вартість продуктивності (тобто швидкість впливу) для створення методу віртуального? Під час виконання кожного виклику методу буде виконуватися пошук у віртуальній таблиці під час виконання виклику методу, тож якщо є дуже часті дзвінки до цього методу, і якщо цей метод дуже короткий, можливо, може бути досягнуто показника ефективності? Я думаю, це залежить від платформи, але хтось запускав якісь орієнтири?
Причина, про яку я запитую, полягає в тому, що я натрапив на помилку, яка трапилася через те, що програміст забув визначити метод віртуальний. Це не перший раз, коли я бачу подібну помилку. І я подумав: чому ми додаємо віртуальне ключове слово при необхідності замість видалення віртуального ключового слова, коли ми абсолютно впевнені, що воно не потрібне? Якщо вартість продуктивності низька, я думаю, що я просто рекомендую в своїй команді наступне: просто зробіть кожен метод за замовчуванням віртуальним, включаючи деструктор, у кожному класі та видаліть його лише тоді, коли вам потрібно. Це звучить для вас божевільно?