Pregunta ¿Están el constructor y el destructor por defecto en línea?


Tengo curiosidad si el constructor y el destructor predeterminados que el compilador genera están en línea o no, porque puedo justificarlo de cualquier manera. Por un lado, quieres el constructor / destructor por defecto para no estar en línea para que al agregarlos más tarde no se rompa ABI (porque los archivos de objetos compilados cuando solo los valores predeterminados estaban allí habrán marcado las definiciones generadas en lugar de las definidas). Por otro lado, para que un compilador C ++ compile código C que funciona tan bien como cuando se compila con un compilador C, no puede agregar llamadas constructor / destructor para cada estructura asignada, y en C ++ la única diferencia funcional entre una clase y se supone que una estructura es la protección de acceso predeterminada. ¿Tal vez el enlazador aborda esto de alguna manera? Tal vez la respuesta varía en todos los compiladores?

Una consecuencia de esta pregunta: si tengo una estructura POD en C ++, ¿puedo beneficiarme teóricamente de algunos compiladores definiendo constructores / destructores en línea vacíos en lugar de los valores predeterminados?


8
2018-06-08 03:41


origen


Respuestas:


El estándar de C ++ dice, en 12.1 [class.ctor] / 5

Un constructor predeterminado declarado implícitamente es un miembro público en línea de su clase

y en 12.4 [class.dtor] / 3

Un implícitamente declarado   destructor es un miembro público en línea de su clase.


17
2018-06-08 03:51



si tengo una estructura POD en C ++, ¿puedo beneficiarme teóricamente de algunos compiladores definiendo constructores / destructores en línea vacíos en lugar de los valores predeterminados?

Teóricamente, ¡sí! Cualquier función (incluidos constructores y destructores) se puede declarar en línea, y poner el cuerpo de la función en la definición de la clase es una forma de hacerlo. Sin embargo, depende del compilador si realmente lo hace alinear la función.


3
2018-06-08 03:46



Varía entre los compiladores, pero en general: sí, deberían.

Con gcc al menos, obtienes tanto una función en línea como una función fuera de línea generada. La versión fuera de línea está marcada como "enlace una vez", por lo que no importa cuántos objetos generen un constructor predeterminado, como máximo solo una versión terminará en el resultado vinculado. Si, de hecho, nadie usa el constructor predeterminado fuera de línea, no está incluido en la salida vinculada, y usted tiene efectivamente una función puramente en línea.


1
2018-06-08 03:56



Preguntas populares