Eficiência dos métodos virtuais (em elaboração)

Em uma palestra sobre otimização de código, me fizeram uma pergunta sobre o desempenho de métodos virtuais. No momento me limitei a dizer que “apesar da fama, não acredito que eles sejam muito mais lentos que uma chamada de método normal”, no entanto acabei com a pulga atrás da orelha. Será que são realmente equivalentes?

Chamadas em C e C++

Para entendermos como o uso de métodos virtuais podem afetar o desempenho de uma aplicação, precisamos entender como as chamadas são implementadas realmente. Somente assim podemos entender suas diferenças.

Funções, ponteiros para função, métodos e métodos virtuais

Após o processo da compilação, todas as chamadas são implementadas com a instrução CALL do processador, passando um endereço como parâmetro. O CALL coloca o endereço da próxima instrução na pilha e altera o registrador IP (ou EIP, RIP) para o endereço passado como parâmetro (ou seja, faz um jump para o endereço). Este endereço pode ser passado de três formas, diretamente na instrução, através de um registrador ou através de uma área da memória (uma variável), e é exatamente aí a diferença entre chamadas de função e ponteiros de função.

Chamadas de função (ou de método) são traduzidas para a instrução CALL passando o endereço diretamente na instrução. No caso das chamadas a ponteiros (ou métodos virtuais) é preciso descobrir o endereço, carregá-lo em um registrador ou posição de memória e utilizar uma das outras formas da instrução. Com a implementação com ponteiros de função realmente existem mais passos a serem feitos, no entanto o impacto desses passos a mais podem ser ou não significativos.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License