2012-05-20 15 views
8

he visto la notación fastcall anexa antes de que muchas funciones. Por qué se usa?¿Para qué se utiliza la palabra clave fastcall en visual c?

+1

No es una cosa C, es una cosa MSVC. –

+1

No se puede deletrear MSVC sin C xP – Mehrdad

+7

Para quien haya votado cerrar esto: ¿Cómo es que esto no es una pregunta real? Sí, es breve y va al grano, pero sin duda es una pregunta muy clara con una respuesta muy clara. –

Respuesta

21

Esa notación anterior a la función se denomina "convención de llamadas". Especifica cómo (en un nivel bajo) el compilador pasará parámetros de entrada a la función y recuperará sus resultados una vez que se haya ejecutado.

Hay muchas convenciones de llamadas diferentes, la más popular es stdcall y cdecl.

Se podría pensar que sólo hay una forma de hacerlo, pero en realidad, hay maneras de que se podría llamar una función y pasar variables de entrada y salida docenas. Puede colocar los parámetros de entrada en una pila (pulsar, presionar, pulsar para llamar; pop, pop, pop para leer los parámetros de entrada). O quizás usted prefiere pegarlas en los registros (esto es fastcall - se trata de encajar algunos de los parametros de entrada en los registros de velocidad).

Pero entonces qué pasa con el pedido? ¿Los empujas de izquierda a derecha o de derecha a izquierda? ¿Qué pasa con el resultado? Siempre hay solo uno (suponiendo que no haya parámetros de referencia), entonces, ¿coloca el resultado en la pila, en un registro, en una determinada dirección de memoria?

Además, supongamos que está utilizando la pila para la comunicación, ¿quién es el trabajo para borrar la pila después de llamar a la función? ¿La persona que llama o la persona que llama?

¿Qué sucede si se realiza una copia de seguridad y luego se restaura el contenido de (ciertos) registros de la CPU? ¿Debería hacerlo la persona que llama, o la persona que llama garantizará que devolverá todo tal como estaba?

La convención de llamadas más popular (con diferencia) es cdecl, que es la convención de llamadas estándar tanto en C como en C++. La API WIN32 usa stdcall, lo que significa que cualquier código que llame a la API WIN32 necesita usar stdcall para esas llamadas a funciones (convirtiéndola en otra opción popular).

fastcall es un poco raro - la gente se dio cuenta de muchas funciones con solo un parámetro de entrada/salida, presionar y abrir desde una pila basada en la memoria es bastante alto y hace que las llamadas funcionen un poco diferentes compiladores introdujeron convenciones de llamadas (diferentes) que colocarán uno o más parámetros en los registros antes de colocar el resto en la pila para un mejor rendimiento. El problema es que no todos los compiladores usaron las mismas reglas para lo que pasa y quién hace qué con fastcall, y como resultado debes tener cuidado al usarlo porque nunca sabrás quién hace qué. Por último, ver Is fastcall really faster? para obtener información sobre fastcall ventajas de rendimiento.

cosas complicadas.

Algo importante a tener en cuenta: no añadir o cambiar convenciones de llamada si no sabe exactamente lo que está haciendo, porque si tanto la persona que llama y la parte llamada no coinciden en la convención de llamada, es probable que termines con corrupción de pila y segfault.Esto generalmente ocurre cuando se llama a la función en una biblioteca DLL/compartida y se escribe un programa que depende de que DLL/SO/dylib sea una convención de llamadas determinada (por ejemplo, cdecl), luego la biblioteca se recompila con una llamada diferente convención (por ejemplo, fastcall). Ahora el programa anterior ya no puede comunicarse con la nueva biblioteca.

2

Wikipedia states that

convenios con derecho fastcall no han sido estandarizados, y se han implementado de manera diferente, dependiendo del vendedor compilador. Normalmente, las convenciones de llamada rápida pasan uno o más argumentos en los registros, lo que reduce el número de accesos de memoria necesarios para la llamada.

Cuestiones relacionadas