Cómo realizar una función en línea en Java

Puedes y no puedes. Lo sé, ¿qué tipo de respuesta es esa?

Puede “forzar” forzar la alineación, por ejemplo:

clase MyDemo
{
muestra pública vacía ()
{
printMyMsg ();
}

public printMyMsg ()
{
System.out.println (“Mi mensaje”);
}
}

Podría ser reemplazado por usted con:

clase MyDemo
{
muestra pública vacía ()
{
// en línea el método a continuación
System.out.println (“Mi mensaje”);
}

public printMyMsg ()
{
System.out.println (“Mi mensaje”);
}
}

Lo cual es una manera sucia de forzar un método en línea (reemplazando la llamada al método con el código real. Obviamente, este es un ejemplo extremadamente simple. Sin embargo, fuera de este tipo de situación, no hay forma de decirle al JIT que haga esto durante el tiempo de compilación como en C ++. El JVM “podría” decidir hacer esto durante la generación de código de bytes de la clase, pero podría no hacerlo y no hay una forma de indicar que debería hacerlo.

Inlining es una optimización realizada por el compilador Java Just-In-Time.

Si tienes un método:

public int addPlusOne (int a, int b) {
devuelve a + b + 1;
}

que llamas así:

public void testAddPlusOne () {
int v1 = addPlusOne (2, 5);
int v2 = addPlusOne (7, 13);

// hacer algo con v1, v2
}

el compilador puede decidir reemplazar su llamada de función con el cuerpo de la función, por lo que el resultado se vería así:

public void testAddPlusOne () {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1

// hacer algo con v1, v2
}

El compilador hace esto para ahorrar la sobrecarga de hacer una llamada a la función, lo que implicaría empujar cada parámetro a la pila.

Claramente, esto solo se puede hacer para funciones no virtuales. Considere lo que sucedería si el método se anulara en una subclase y el tipo del objeto que contiene el método no se conozca hasta el tiempo de ejecución … ¿cómo sabría el compilador qué código copiar: el cuerpo del método de la clase base o el cuerpo del método de la subclase? ? Como todos los métodos son virtuales de forma predeterminada en Java, puede marcar explícitamente aquellos que no se pueden anular como final (o ponerlos en una clase final ). Esto ayudará al compilador a descubrir que el método nunca será anulado, y es seguro en línea. (Tenga en cuenta que el compilador a veces también puede hacer esta determinación para métodos no finales).

Además, tenga en cuenta la palabra mayo en la cita. No se garantiza que los métodos finales sean en línea. Hay varias formas en que puede garantizar que un método no se pueda insertar en línea, pero no hay forma de forzar al compilador a conectarse. De todos modos, casi siempre sabrá mejor que usted cuando la alineación ayude a perjudicar la velocidad del código resultante.

Consulte wikipedia para obtener una buena descripción general de los beneficios y problemas.

Java no es compatible con c / c ++ como la función en línea; el único momento en que ocurre la alineación es automáticamente en tiempo de ejecución por la zona activa jvm

La arquitectura del motor de rendimiento de Java HotSpot