online c++ class inline

online - Está "en línea" implícito en las funciones miembro de C++ definidas en la definición de clase



inline function c (4)

está poniendo el calificador "en línea" en dicha función miembro definida en la definición de clase completamente redundante?

Para el estilo de código, ¿sería sensato conservar la etiqueta "en línea", por lo que un desarrollador futuro se dará cuenta de que la función debe estar en línea, y no elimina la definición en otro lugar y elimina la alineación?

No.
El en línea es para "Una regla de definición" (y, por lo tanto, vinculando por extensión). Si la función está definida donde se requiere en inline y no se proporciona, se trata de un error de tiempo de compilación. Si no es necesario, es simplemente una pelusa extra inútil.

Entonces, si no lo necesitas, quítalo. Si lo necesitas, póngalo allí (si olvidas que el compilador te lo hará saber).

De acuerdo con la especificación C ++, ¿las dos clases siguientes están definidas de manera equivalente?

class A { void f() { } }; class B { inline void f() { } };

es decir, ¿está poniendo el calificador "en línea" en dicha función miembro definida en la definición de clase completamente redundante?

Pregunta de seguimiento: suponiendo que es redundante, para el estilo de código, ¿sería sensato conservar la etiqueta "en línea", por lo que un desarrollador futuro se dará cuenta de que la función debe estar en línea y no eliminará la definición en otro lugar y eliminará la línea?

Gracias :)


El en línea es opcional en ese caso, sí. El compilador sabrá que está en línea y no generará múltiples instancias de la función cada vez que se incluya el encabezado.

En cuanto a si es una buena idea dejarlo allí, realmente no lo creo. Sería mejor dar un comentario detallado explicando por qué la función DEBE estar en línea (de la cual solo puedo desvanecer 2 razones: o bien "es una plantilla" en cuyo caso el forro es imposible, o "rendimiento" en cuyo caso Me gustaría ver alguna evidencia de apoyo, en lugar de "tiene que funcionar mejor porque está en línea" que he visto en algunos lugares.


El estándar ISO C ++ dice:

"Una función definida dentro de una definición de clase es una función en línea".

Sin embargo, esto no significa que la función estará forzosamente en línea: en general, hoy en día, parece que el compilador decidirá si incluir la función dará algún beneficio.


Son definiciones de clase equivalentes, excepto para los propósitos de la Regla de una sola definición. Por lo tanto, el estándar no garantiza que pueda compilar una TU (unidad de traducción) con una definición de clase y una TU diferente con la otra, y luego unirlas. Dudo que esto realmente falle en una implementación real, pero eso es lo que dice la norma.

La palabra clave en inline tiene nada que ver con la alineación. Se trata de si se permiten múltiples definiciones idénticas de la función en diferentes TU. Si alguien mueve la definición de la función a otra parte, entonces debe decidir si marcarla en inline de la siguiente manera:

  • Si está en un archivo .cpp para esa clase, entonces es válido marcarlo en inline si se llama solo desde esa TU. Entonces, probablemente no importe si está marcado en inline o no, pero puede marcarlo en inline como una sugerencia de compilación si cree que el compilador prestará atención a lo que desea.

  • Si todavía está en el archivo de encabezado, debe marcarse en inline , de lo contrario obtendrá múltiples errores de definición al vincular diferentes TU que usan el encabezado.

Asumiendo que la persona que mueve la función conoce esas cosas, no creo que necesiten un recordatorio en la definición de la clase. Si ellos no saben esas cosas, entonces probablemente no tengan ningún negocio moviendo la función, pero sería más seguro para ellos tener una palabra clave en inline para moverse con ella.