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?
Respuesta
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.
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.
- 1. ¿Para qué se utiliza la palabra clave 'char'?
- 2. ¿Para qué se utiliza la palabra clave Javascript Package?
- 3. ¿Para qué se utiliza la palabra clave "con" de python?
- 4. Apagar resaltando la palabra clave "evento" en Visual C++
- 5. ¿Para qué se utiliza la carpeta App_Data en Visual Studio?
- 6. ¿Cuándo utiliza exactamente la palabra clave volátil en Java?
- 7. ¿Para qué es la palabra clave nativa en Java?
- 8. C++ 11 thread_local palabra clave compatible en visual studio 11
- 9. ¿Cuándo se debe usar la palabra clave volátil en C#?
- 10. ¿Qué pasa con la palabra clave "nueva" en C++?
- 11. ¿Qué hay de malo con este programa C que utiliza la palabra clave extern?
- 12. Para qué se utiliza PriorityAttribute en MSTEST/Visual Studio
- 13. Palabra clave protegida C#
- 14. palabra clave 'fuera' en C++
- 15. palabra clave estática en C#
- 16. Falta la palabra clave 'con' en C#
- 17. ¿Qué pasó con la palabra clave 'entrada'?
- 18. palabra clave "agradable" en C++?
- 19. C# ref uso de la palabra clave
- 20. Registro palabra clave en C++
- 21. ¿Para qué sirve la palabra clave forSome en Scala?
- 22. La palabra clave vinculante se refiere a qué?
- 23. C# palabra clave virtual
- 24. ¿Para qué es la palabra clave de método utilizada en C#?
- 25. ¿Cuál es la palabra clave explícita para en C++?
- 26. ¿Está 'usando' una palabra clave C#?
- 27. C# Patrones de uso para la palabra clave "es"
- 28. C# equivalente para la palabra clave de Visual Basic: 'Con' ... 'End With'?
- 29. ¿Qué significa la palabra clave jsr?
- 30. C: Comportamiento de la palabra clave `const`
No es una cosa C, es una cosa MSVC. –
No se puede deletrear MSVC sin C xP – Mehrdad
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. –