En C++, una función miembro de clase se puede declarar:
Dentro de la clase (definición en línea):
class A { void foo() { /* ... */ } // directamente dentro de la clase };
Tales funciones se consideran implícitamente inline.
Dentro de la clase (solo declaración):
class A { void foo(); // solo declaración }; void A::foo() { /* ... */ } // definición fuera de la clase
Diferencias:
inline, el compilador puede incrustar tal función directamente en el código de su llamada.inline sin indicación explícita (inline), aunque se puede añadir la palabra clave:
inline void A::foo() { /* ... */ }
Ventajas y desventajas de los enfoques:
¿Siempre será realmente incorporada por el compilador una función definida dentro de la clase?
Respuesta: No. La palabra clave inline (incluyendo la asignación implícita al definir dentro de la clase) es solo un deseo para el compilador. El compilador puede ignorar este consejo si considera que la función es demasiado compleja o inadecuada para la incorporación.
Historia 1
En un gran proyecto, las funciones miembro se definieron como
inlinedentro de archivos de encabezado e incluidas en miles de unidades de traducción, lo que resultó en un tiempo de compilación aumentó varias veces, y el binario creció debido a la duplicación de código — el compilador no siempre combina implementaciones de máquina idénticas.
Historia 2
En un intento de acelerar la ejecución, un desarrollador colocó toda la lógica de la clase en la declaración (en el archivo .h). Esto provocó que, al modificar la función, se recompilara todo el proyecto, y no solo archivos individuales (que realmente fueron afectados por la integración).
Historia 3
Un nuevo miembro del equipo colocó largos métodos de serialización y manipulación de archivos directamente en la declaración de la clase plantilla, causando la propagación accidental de errores en todas las TU, y un aumento excesivo del tamaño del archivo ejecutable sin mejora del rendimiento.