¿Qué es esto? ¿Y cómo soy afectado por esto como desarrollador?¿Qué son las convenciones de llamadas personalizadas?
relacionadas:
What are the different calling conventions in C/C++ and what do each mean?
¿Qué es esto? ¿Y cómo soy afectado por esto como desarrollador?¿Qué son las convenciones de llamadas personalizadas?
relacionadas:
What are the different calling conventions in C/C++ and what do each mean?
A llamando al convenio describe cómo algo puede llamar a otra función. Esto requiere que los parámetros y el estado pasen a la otra función, para que pueda ejecutar y devolver el control correctamente. La forma en que se hace esto debe estandarizarse y especificarse, de modo que el compilador sepa cómo ordenar parámetros para el consumo mediante la función remota que se está llamando. Hay varias convenciones de llamada estándar, pero los más comunes son fastcall
, stdcall
, y cdecl
.
Por lo general, el término de llamadas personalizado convención es un nombre poco apropiado y se refiere a una de dos cosas:
A no estándar convención de llamada o uno que no está en generalizada uso (por ejemplo, si está construyendo una arquitectura desde cero).
Optimización especial que puede realizar un compilador/enlazador que utiliza una convención de llamadas de un solo uso con el fin de mejorar el rendimiento.
En este último caso, esto ocasiona que algunos valores que de otro modo serían empujados a la pila se almacenaran en los registros. El compilador intentará tomar esta decisión basándose en cómo se usan los parámetros dentro del código. Por ejemplo, si el parámetro se va a utilizar como un valor máximo para un índice de bucle, de manera que el índice se compare con el máximo en cada iteración para ver si las cosas deberían continuar, sería un buen caso para moverlo a un registro.
Si se lleva a cabo la optimización, esto generalmente reduce el tamaño del código y mejora el rendimiento.
¿Y cómo me afecta esto como desarrollador?
Desde su punto de vista como desarrollador, probablemente no le importe; esta es una optimización que sucederá automáticamente.
Cada lengua, cuando se llama a una función, tiene una convención sobre lo que se pasan los parámetros de las variables de registro frente a la pila, y cómo los valores devueltos Será devuelto.
A veces se usa una convención diferente a la estándar y se conoce como convención de llamadas personalizadas.
Esto es más común cuando se interopera entre diferentes idiomas. Por ejemplo, C y Pascal tienen diferentes convenciones sobre cómo pasar parámetros. Desde el punto de vista de C, la convención de llamadas de Pascal podría ser referida como una convención de llamadas personalizada.
"pascal" no es una convención de llamadas personalizada; es una convención de llamadas normal y con nombre. Además, es historia, ¿no? Una reliquia de días de 16 bits? – Steve314
Dije que es una convención de llamadas personalizada desde el punto de vista de C, que es correcta. Además, es un ejemplo adecuado para explicar el concepto, y ciertamente no merece un voto negativo. –
A menos que esté manipulando directamente la pila o escribiendo un ensamblaje en línea haciendo referencia a las variables locales, no le afecta. O bien, si está interactuando con bibliotecas vinculadas con diferentes convenciones de llamadas
Qué es: La mayoría de los compiladores usan una convención de llamadas estándar como cdecl donde los argumentos de las funciones se envían en un orden determinado a la pila y demás.
Esto no es del todo correcto. Preguntó sobre las convenciones de llamadas "personalizadas", que son una optimización especial y no corresponden a ninguna convención de llamadas existente en particular. –
No creo que realmente deba preocuparse.
Las convenciones de llamada normal son cosas como __stdcall y __fastcall. Determinan cómo se convierte su firma de llamada en un diseño de pila, quién (llamador o destinatario) es responsable de guardar y restaurar registros, etc. Por ejemplo, __student_fastcall debería usar más registros donde __stdcall usaría más stack.
Las convenciones de llamada personalizada están optimizadas específicamente para una función en particular y la forma en que se utiliza. Solo suceden, IIRC, para funciones que son locales para un módulo particular. Así es como el compilador sabe mucho sobre cómo se usa, y también cómo sabe que ningún llamante externo necesita poder especificar la convención.
Basado en eso, su compilador los usará automáticamente cuando sea apropiado, su código se ejecutará un poco más rápido y/o ocupará un poco menos de espacio, pero realmente no necesita preocuparse por ello.
¿En qué contexto? Win32? Win64? Linux? Solaris? Intel? PowerPC? –
duplicado: http://stackoverflow.com/questions/949862/what-are-the-different-calling-conventions-in-cc-and-what-do-each-mean – Earlz
Sospecho que las personas que votaron para cerrar este ya sea (a) ** no entiendo qué _custom_ convenciones de llamada son ** o (b) ** no leyó la pregunta correctamente **. Son una optimización especial, que no está cubierta por la pregunta duplicada. Vota para volver a abrir y eliminar la información duplicada. –