Si la función es pequeña (la posibilidad de que iba a cambiar con frecuencia es baja), y si la función se puede poner en la cabecera sin incluir miríadas de otras cabeceras (debido a que su función depende de ellos), se es perfectamente válido para hacerlo. Si se declaran en línea externo, entonces se requiere el compilador para darle la misma dirección por cada unidad de compilación:
headera.h:
inline string method() {
return something;
}
funciones miembros están en línea implícita siempre que se definen en el interior su clase. Lo mismo es cierto para ellos: si pueden colocarse en el encabezado sin complicaciones, de hecho puede hacerlo.
Como el código de la función se coloca en el encabezado y es visible, el compilador puede hacer llamadas en línea, es decir, poner el código de la función directamente en el sitio de la llamada (no tanto porque lo puso en línea antes pero más porque el compilador decide de esa manera. Poner en línea solo es una pista para el compilador sobre eso). Eso puede dar como resultado una mejora en el rendimiento, porque el compilador ahora ve donde los argumentos coinciden con las variables locales para la función, y donde el argumento no se alía entre sí, y por último pero no menos importante, la asignación del marco de función ya no es necesaria.
Según tengo entendido, cuando la compilación finalice, el compilador expandirá el archivo de encabezado y lo colocará donde está incluido. ¿Es eso correcto?
Sí, eso es correcto.La función se definirá en cada lugar donde incluya su encabezado. Al compilador le importará poner solo una instancia del mismo en el programa resultante, eliminando los demás.
Gracias. Todas estas pequeñas funciones son virtuales. ¿Eso marcará alguna diferencia en la alineación? Y creo que escribir el cuerpo de la función en el archivo fuente y marcar como en línea es mejor que escribir directamente en el encabezado. Me temo que el archivo de encabezado será menos legible si todas estas funciones están definidas allí. –
si el compilador puede encontrar la dirección de una llamada de función virtual, también puede alinear: b * b_ = new d; doit (b_); // si inserta doit, verá que b_ es d. entonces podría alinear el código de la definición de la función virtual tal como está en d. virtual hace que sea más difícil, pero no imposible, –
pero estoy de acuerdo con usted: a menudo recuerdo que coloco el código en los encabezados, porque cuando lo cambio afecta a todo el código que lo ha llamado, y con frecuencia definir en los encabezados requiere incluir al menos otro encabezado del que depende el código. (no siempre para los getters simples, los pongo allí). –