sirve - set y get c++
¿Por qué los constructores y destructores en línea no son una buena idea en C++? (5)
Aparte de la razón, @oli menciona en su respuesta:
El libro probablemente guía sobre constructores y destructores no intrincados, ya que incluso las funciones aparentemente triviales o vacías a menudo pueden contener gran cantidad de código generado implícitamente por el compilador y la definición de la función real puede llegar a ser bastante grande.
Dicho esto, es prudente dejar que el compilador realmente decida si en línea o no en línea una llamada de función (incluso constructores y destructores), la mayoría de los compiladores de hoy en día optimizarán adecuadamente las funciones a través de la alineación.
Recuerdo haber leído en uno de los libros de C ++ (hace bastante tiempo) que no es una buena idea tener Constructores y Destructores en línea especialmente para la clase derivada. Entiendo que la inclusión en línea induciría a una cierta cantidad de código del objeto, pero ¿existen otras consideraciones de diseño que desanimen a los constructores y destructores en línea? Por supuesto, la mayoría de los compiladores pueden rechazar la línea y continuar con la creación de un cuerpo de función, pero si tuvieran que incluir la línea, ¿qué multa podría tener que pagar?
El compilador es gratis para el código en línea que no ha declarado en línea, y es libre para no para el código en línea que ha declarado en línea. He visto compiladores hacer ambas cosas. Debido a esto, la palabra clave en línea no significa lo que la mayoría de la gente piensa que hace. Su significado es permitir una excepción a la regla de una definición, para que pueda poner funciones, etc., en un archivo de encabezado y no obtener errores del vinculador.
Entonces, el consejo es basura, deje que el compilador decida qué es lo mejor en línea y qué no lo es. Ponga en línea donde lo necesite para evitar errores de vinculador, eso es todo.
Estoy bastante seguro de que esto no se trata de lo que C ++ hace con el código, porque, como se dijo, es solo una pista.
Si empiezas a mirar la consideración de la ingeniería de software, las cosas cambian Todos los cambios en la función en línea forzarán las recompilaciones de todos los archivos dependientes.
Se agrava cuando mantiene una biblioteca y desea enviar una versión de corrección de errores, siendo ABI compatible. Las funciones en línea simplemente no pueden ser reemplazadas por otra versión porque el código de llamada no puede ser recompilado. Entonces, cuando su función no en línea pueda ser reemplazada a voluntad, tendrá que cambiar a una nueva versión de su interfaz cuando las funciones en línea necesiten ser cambiadas.
Combine esto con el hecho de que los compiladores rara vez pueden ser realmente incorporados por el compilador, entonces usted puede imaginar por qué un libro daría los consejos mencionados.
No hay absolutamente ninguna razón para evitar constructores y destructores en línea. El libro está mal como mal puede estarlo.
No sé sobre constructores, pero los destructores son muy a menudo virtual
. En la mayoría de los casos, no tiene sentido que el compilador incorpore funciones virtuales, ya que no se sabe hasta qué tiempo de ejecución se llamará la anulación.