Pregunta

He visto el fastcall la notación que se anexa antes de que muchas de las funciones.¿Por qué se utiliza?

¿Fue útil?

Solución

Que la notación antes de que la función es llamada la "convención de llamada." Se especifica la forma (a bajo nivel) que el compilador de pasar parámetros de entrada de la función y recuperar sus resultados una vez que se ha ejecutado.

Hay muchos tipos diferentes de convenciones de llamada, el ser más popular stdcall y cdecl.

Usted podría pensar que sólo hay una manera de hacerlo, pero en realidad, hay docenas de maneras que usted podría llamar a una función y pasar variables en y fuera.Usted puede colocar los parámetros de entrada en una pila (push, push, push a llamar;pop, pop, pop para leer los parámetros de entrada).O tal vez prefiere ceñirse a ellas en los registros (esto es fastcall - se trata de algunos de los parámetros de entrada en los registros de velocidad).

Pero entonces, ¿qué acerca de la orden?¿Empuje de izquierda a derecha o de derecha a izquierda?¿Y el resultado - siempre hay sólo uno (suponiendo que no hay parámetros de referencia), así que usted coloque el resultado en la pila, en un registro, en una cierta dirección de memoria?

También, vamos a suponer que usted está utilizando la pila de comunicación - que es el trabajo del que en realidad es clara la pila después de la función se llama - la persona que llama o el destinatario?

¿Qué acerca de la copia de seguridad y, a continuación, restaurar el contenido de (ciertos) los registros de la CPU - la persona que llama debe hacerlo, o que el destinatario garantía de que va a volver todo el camino se fue?

El más popular de la convención de llamada (por ahora) es cdecl, que es la convención de llamada estándar en C y C++.La API de WIN32 utiliza stdcall, lo que significa que cualquier código que llama a la API de WIN32 necesita utilizar stdcall para aquellas llamadas a función (lo que es otra opción popular).

fastcall es un poco de un bicho raro - la gente se dio cuenta de que muchas de las funciones con sólo un parámetro de entrada/salida, empujando y surgiendo de una memoria basada en la pila es un poco de sobrecarga y hace la función de llamadas de un poco pesado para los diferentes compiladores introducido (diferentes), llamando a los convenios que se coloque uno o más parámetros en los registros antes de colocar el resto de la pila para un mejor rendimiento.El problema es que no todos los compiladores utilizan las mismas reglas para lo que va a donde y quién hace qué con fastcall, y como resultado, usted tiene que tener cuidado al usarlo porque nunca vas a saber quién hace qué.Por último, ver Es fastcall realmente más rápido? para obtener información sobre fastcall beneficios de rendimiento.

Complicadas.

Algo importante a tener en cuenta:no añadir o cambiar las convenciones de llamada si no sabes exactamente lo que estás haciendo, porque si la persona que llama y el destinatario no está de acuerdo con la convención de llamada, lo más probable es acabar con la corrupción de la pila y una violación de segmento.Esto sucede generalmente cuando se tiene la función de ser llamado en un archivo DLL/biblioteca compartida y un programa está escrito que depende de la DLL/SO/dylib siendo cierta la convención de llamada (por ejemplo, cdecl), a continuación, la biblioteca se vuelve a compilar con una convención de llamada diferente (por ejemplo, fastcall).Ahora el viejo programa no puede comunicarse con la nueva biblioteca.

Otros consejos

En Wikipedia se afirma que

Convenios de derecho fastcall no se han estandarizado, y han sido aplicadas de manera diferente, dependiendo del proveedor de compilador.Normalmente fastcall convenciones de llamada de pasar uno o más argumentos en los registros que se reduce el número de accesos a la memoria requerido por la convocatoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top