Pregunta

¿Que son estos? ¿Y cómo estoy afectado por estos como desarrollador?

Relacionado:
¿Cuáles son las diferentes convenciones de llamadas en C/C ++ y qué significa cada uno?

¿Fue útil?

Solución

A Convención de llamadas describe cómo algo puede llamar a otra función. Esto requiere que los parámetros y el estado se pasen a la otra función, para que pueda ejecutar y devolver el control correctamente. La forma en que esto se hace debe estandarizarse y especificarse, de modo que el compilador sepa cómo ordenar los parámetros para el consumo por la función remota que se llama. Hay varias convenciones de llamadas estándar, pero las más comunes son fastcall, stdcall, y cdecl.

Por lo general, el término Convención de llamadas personalizadas es un poco inapropiado y se refiere a una de dos cosas:

  • Una convención de llamadas no estándar o una que no está en uso generalizado (por ejemplo, si está construyendo una arquitectura desde cero).

  • Una optimización especial que puede realizar un compilador/enlazador que utiliza una convención de llamadas de una sola vez con el propósito de mejorar el rendimiento.

En el último caso, esto causa algunos valores que de otro modo serían empujados a la pila para almacenarse en registros. El compilador intentará tomar esta decisión en función de cómo se utilizan los parámetros dentro del código. Por ejemplo, si el parámetro se utilizará como un valor máximo para un índice de bucle, de modo que el índice se compara con el máximo en cada iteración para ver si las cosas deberían continuar, ese sería un buen caso para moverlo a un Registrarse.

Si se lleva a cabo la optimización, esto generalmente reduce el tamaño del código y mejora el rendimiento.

¿Y cómo estoy afectado por estos como desarrollador?

Desde su punto de vista como desarrollador, probablemente no le importe; Esta es una optimización que sucederá automáticamente.

Otros consejos

Cada idioma, al llamar a una función, tiene una convención sobre qué parámetros se pasarán en las variables de registro frente a la pila, y cómo se devolverán los valores de retorno.

A veces, se usa una convención diferente a la estándar y se conoce como una convención de llamadas personalizada.

Esto es más común cuando se introduce entre diferentes idiomas. Por ejemplo, C y Pascal tienen diferentes convenciones sobre cómo pasar los parámetros. Desde el punto de vista de C, la convención de llamadas de Pascal podría referirse como una convención de llamadas personalizadas.

No creo que realmente necesite importarle.

Las convenciones de llamadas normales son cosas como __stdcall y __fastcall. Determinan cómo su firma de llamada se convierte en un diseño de pila, quién (llamado o calle) es responsable de guardar y restaurar registros, etc. Por ejemplo, __fastcall debería usar más registros donde __stdcall usaría más pila.

Las convenciones de llamadas personalizadas se optimizan específicamente para una función en particular y la forma en que se usa. Solo suceden, IIRC, para funciones locales de un módulo en particular. Así es como el compilador sabe tanto sobre cómo se usa y también cómo sabe que ninguna persona que llama externa necesita poder especificar la convención.

Según eso, su compilador los usará automáticamente cuando sea apropiado, su código se ejecutará un poco más rápido y/o tomará un poco menos de espacio, pero realmente no necesita preocuparse por ello.

A menos que esté manipulando directamente la pila o escriba el ensamblaje en línea que hace referencia a las variables locales, no le afecta. O si su interfaz con bibliotecas vinculadas con diferentes convenciones de llamadas

Qué es: la mayoría de los compiladores y tal usan una convención de llamadas estándar, como CDECL, donde los argumentos de la función se impulsan en un cierto orden a la pila y tal.

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