Ter pelo menos um método virtual em uma classe C ++ (ou qualquer uma de suas classes pai) significa que a classe terá uma tabela virtual e cada instância terá um ponteiro virtual.
Portanto, o custo da memória é bastante claro. O mais importante é o custo de memória nas instâncias (especialmente se as instâncias são pequenas, por exemplo se elas foram destinadas apenas a conter um inteiro: neste caso, ter um ponteiro virtual em cada instância pode dobrar o tamanho das instâncias. o espaço de memória usado pelas tabelas virtuais, acho que geralmente é insignificante em comparação com o espaço usado pelo código do método real.
Isso me leva à minha pergunta: há um custo de desempenho mensurável (ou seja, impacto na velocidade) para tornar um método virtual? Haverá uma consulta na tabela virtual em tempo de execução, a cada chamada de método, portanto, se houver chamadas muito frequentes para esse método e se este método for muito curto, pode haver um impacto mensurável no desempenho? Acho que depende da plataforma, mas alguém já executou alguns benchmarks?
A razão pela qual estou perguntando é que me deparei com um bug que aconteceu devido ao esquecimento de um programador de definir um método virtual. Esta não é a primeira vez que vejo esse tipo de erro. E eu pensei: por que adicionar a palavra-chave virtual quando necessário, em vez de remover a palavra-chave virtual quando estamos absolutamente certo de que ele é não é necessário? Se o custo de desempenho for baixo, acho que vou simplesmente recomendar o seguinte para minha equipe: simplesmente tornar todos os métodos virtuais por padrão, incluindo o destruidor, em todas as classes e removê-lo apenas quando for necessário. Isso parece loucura para você?