2008-11-05 15 views
10

Con frecuencia encuentro clases grandes que no son de plantilla en C++ donde los métodos simples se definen directamente en el cuerpo de la clase en el archivo de encabezado en lugar de por separado en el archivo de implementación. Por ejemplo:¿Por qué los métodos C++ a veces se definen dentro de las clases?

class Foo { 
    int getBar() const { return bar; } 
    ... 
}; 

¿Por qué hacer esto? Parece que hay desventajas. La implementación no está tan oculta como debería ser, el código es menos legible y también habría una mayor carga en el compilador si el archivo de encabezado de la clase se incluye en muchos lugares diferentes.

Supongo que las personas tienen la intención de incluir estas funciones en otros módulos, lo que podría mejorar significativamente el rendimiento. Sin embargo, he escuchado que los compiladores más nuevos pueden hacer inline (y otras optimizaciones entre procesos) en tiempo de enlace entre los módulos. ¿Qué tan amplio es el soporte para este tipo de optimización de tiempo de enlace, y realmente hace innecesario este tipo de definiciones? ¿Hay alguna otra buena razón para estas definiciones?

Respuesta

14

El estándar de C++ dice que los métodos definidos dentro de la definición de clase son inline de forma predeterminada. Esto se traduce en ganancias de rendimiento obvias para funciones simples como getters y setters. La optimización de módulos cruzados en tiempo de enlace es más difícil, aunque algunos compiladores pueden hacerlo.

+1

Sí, pero "en línea por defecto" no significa que el compilador los alineará, solo que no tiene que agregar manualmente la * sugerencia * que la palabra clave "en línea" realmente es. –

2

Ha respondido su propia pregunta, de hecho son métodos en línea.

Las razones para usarlas son el rendimiento.

+0

Aún así, esto no significa que el compilador los alineará, solo que no tiene que agregar manualmente la * sugerencia * que la palabra clave "en línea" realmente es. –

7

A menudo no hay otra razón más que simplemente es más fácil y ahorra tiempo. También guarda un poco de desorden en el archivo de implementación, mientras ocupa el mismo número de líneas en el archivo de encabezado. Y ser menos legible es bastante difícil si se limita a cosas como getters y setters.

+0

No hay necesidad de agrupar el archivo fuente con un código trivial. –

Cuestiones relacionadas