c++ - poo - ¿Por qué el constructor y destructor predeterminado de una clase está en línea?
ejemplos de clases en c++ (2)
Leí de multiple sources que:
Si no se proporcionan constructores declarados por el usuario de ningún tipo para un tipo de clase (estructura, clase o unión), el compilador siempre declarará un constructor predeterminado como un miembro público en línea de su clase.
¿Por qué se tomó esta decisión (para declarar explícitamente ctors / dtors como en línea)? ¿Los compiladores son libres de estar en línea / no en línea de todos modos? ¿Especialmente porque los inspectores en línea pueden tener una gran multa para los clientes de una clase (C ++ efectivo, Artículo # 30)?
No están en línea en el sentido de que "siempre estarán en línea por el compilador". Están en línea en el sentido "considerado definido en cada unidad de traducción que ve la definición de clase, sin violar la Regla de una definición (ODR) ". Tenga en cuenta que este último es el único significado de la frase "función en línea" que utiliza C ++ estándar.
Marcar explícitamente una función con la palabra clave en inline
es también una sugerencia no vinculante para el compilador para en realidad alinear la función, pero dudo que los compiladores y optimizadores modernos presten mucha atención a esta sugerencia. Sin embargo, tenga en cuenta que esto (sugerencia para en línea) se aplica solo al uso de la palabra clave en inline
, y no a las funciones en línea implícitamente (como el constructor predeterminado y el destructor mencionados en la pregunta).
inline
tiene dos significados en el estándar de C ++.
Lo primero es lo que piensas cuando escuchas en inline
; tomando el código en la función e inyectándolo en el lugar donde se llama.
El estándar de C ++ aconseja a las implementaciones hacer esto cuando ven un método o función en línea, pero no lo requieren. Como tal acción tiene cero cambios de comportamiento observables en la máquina abstracta que describe el estándar de C ++, considero que es un consejo no normativo.
El segundo tiene que ver con la vinculación. Una función en inline
(o en C ++ 17 una variable) puede existir en múltiples unidades de traducción. Normalmente esto causa un error en el tiempo de enlace; pero cuando la variable o función está en inline
, en cambio, todas las instancias de la variable o función, excepto una, se descartan silenciosamente. Si difieren de alguna manera importante, esto hace que su programa no se forme correctamente, no se requiere un diagnóstico.
Este segundo significado es la razón por la cual los indicadores y los factores están implícitamente en línea; significa que no se debe elegir una sola unidad de traducción para que "vivan en". En su lugar, se generan en todas partes donde se necesitan. Es posible que se incluyan preferentemente en línea en el código de llamada, pero lo más importante es que si aún existen copias de él (porque no estaba en línea, por ejemplo), no se produce ningún error en el momento del enlace y, en cambio, se descartan todos menos uno.
Ver en inline en el estándar de C ++. La redacción de la norma es un poco más difícil de entender, diferente y más precisa que la que uso anteriormente.