2011-01-24 8 views
8

En C/C++ (específicamente, estoy usando MSVS), ¿en qué situación alguna vez tendría que preocuparse de especificar una convención de llamadas para una definición de función? ¿Alguna vez son importantes? ¿No se puede cumplir la convención óptima cuando sea necesario (es decir, llamada rápida, etc.)?MS Visual C++: ¿Cuándo debería preocuparse por usar las convenciones de llamadas?

Quizás mi comprensión es deficiente, pero simplemente no veo cuando sería un caso que el programador tendría que preocuparse por cosas como el orden en que los argumentos se colocan en la pila y así sucesivamente. Tampoco veo por qué la optimización del compilador no podría elegir el esquema que funcione mejor para esa función en particular. Cualquier conocimiento que alguien pueda proporcionarme sería genial. ¡Gracias!

+0

Es puramente una consideración legado feo debido al mal diseño de Windows 1.0 que se llevó a cabo sin ninguna razón. Siempre que use los encabezados correctos para obtener prototipos para las funciones de la biblioteca a las que llama, no debería tener que gastar ningún esfuerzo al pensar en ello, excepto tal vez al escribir funciones de devolución de llamada que se requieren para tener una convención de llamadas particular. –

+0

R, ¿quiere decir que las convenciones de llamadas no serán importantes para el código rápido? – Mandrake

Respuesta

6

No necesita preocuparse por las aplicaciones de 64 bits ya que solo hay una convención de llamadas.

Es necesario para cuidar de aplicaciones de 32 bits en los siguientes casos:

  • de interactuar con las bibliotecas 3 ª parte y las cabeceras de estas bibliotecas no declaró la convención de llamada correcta.
  • Está creando una biblioteca o DLL para que otra persona lo use. Debe decidir sobre una convención de llamadas para que otro código use la convención de llamada correcta cuando llame a su código.
+1

+1 para el punto de aproximadamente 64 bits que solo tiene una convención de llamadas. –

+1

en realidad, 64 bits tiene dos convenciones de llamadas en x86_64 al menos - la convención de llamadas de Microsoft y la convención de llamadas estándar –

+0

Acabo de enterarme ahora que 64 tiene solo una – Mandrake

10

En términos generales, la convención de llamada es importante cuando se está integrando código que está siendo compilada por diferentes compiladores. Por ejemplo, si está publicando una DLL que usarán sus clientes, querrá asegurarse de que todas las funciones que exporta tengan una convención de llamadas consistente y esperada.

Tiene razón en que, en un solo programa, el compilador generalmente puede elegir qué convención de llamadas usar para cada función (y las reglas son generalmente bastante simples).

Cuestiones relacionadas