subrutinas resueltos raiz programas programación problemas intrinsecas funciones ejemplos cuadrada compilar como arcoseno fortran fortran2003

raiz - problemas resueltos de programación en fortran 95 pdf



¿Hay subrutinas de llamadas indirectas adicionales con tipos derivados polimórficos cuando se conoce el tipo en tiempo de compilación? (1)

Sí, hay un costo adicional de una llamada virtual llamada. Se utiliza una tabla de métodos virtuales (como se llama en otros idiomas) y se busca el procedimiento adecuado para llamar. Es probable que el costo sea similar al de una llamada de función virtual en C ++, consulte https://stackoverflow.com/a/453001/721644.

El compilador a veces puede averiguar qué procedimiento llama el enlace incluso en el momento de la compilación. Por ejemplo, cuando el objeto pasado real no es polimórfico. GCC tiene dos indicadores -fdevirtualize y -fdevirtualize-speculatively (habilitados con -O2, -O3, -Os) que convierten las llamadas virtuales en llamadas directas. También son aplicables a Fortran.

Tengo dos tipos derivados (child1 y child2) que se extienden desde el mismo tipo abstracto ( type, abstract :: parent ). El tipo abstracto tiene un procedimiento de límite diferido.

Quiero llamar a una subrutina que realiza algunas cosas (rendimiento crítico) según el tipo de niño entregado como entrada. Puedo pensar en dos opciones:

  • La subrutina toma la class(parent), intent(inout) :: type_in como entrada. Las implementaciones para los niños se realizan dentro de una construcción de select type (type_in) .
  • Escribo dos subrutinas, una con type(child1), intent(inout) :: type_in y una con type(child2), intent(inout) :: type_in y proporciona una interfaz explícita para sobrecargar el nombre de la rutina.

La primera opción permite implementaciones donde la extensión del padre no se conoce en tiempo de compilación, pero eso no es necesario en mi caso. También guarda algunas líneas de código porque solo una parte es diferente para los niños.

Mi pregunta es: ¿hay una sobrecarga adicional en la opción uno porque implementé la entrada como datos polimórficos cuando el tipo se conoce en tiempo de compilación?