2011-06-08 7 views
7

Tengo curiosidad por saber 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, quiere que el constructor/destructor predeterminado sea no esté en línea para que agregarlos más tarde no rompa ABI (porque los archivos de objeto compilados cuando solo los valores predeterminados habrán incorporado las definiciones generadas en lugar de lo que define) 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?¿Están el constructor y el destructor predeterminados siempre en línea?

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?

+0

La diferencia entre las palabras clave 'clase' y' struct' no se supone. –

+0

@Luc: Supuesto en el sentido de que este es el tipo de obscura donde pude ver un compilador que no cumple con los estándares. –

Respuesta

16

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

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

y en 12.4 [class.dtor]/3

una declarado implícitamente- destructor es una n Miembro público en línea de su clase.

+0

Lo que interpreto que significa más o menos lo mismo que la palabra clave 'inline': que el compilador es libre de ejercitar su propio juicio y de que * no * alinea realmente al constructor si es excesivamente grande ... ¿es eso lo que usted también entiende? –

+0

@Tony Creo que sí, sí. 7.1.2/2 dice, autorreferencialmente, "No se requiere una implementación para realizar esta sustitución en línea en el punto de llamada, sin embargo, incluso si esta sustitución en línea se omite, las otras reglas para las funciones en línea definidas en 7.1.2 deberán aún se debe respetar " – Cubbi

3

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?

Theorotically, Yes! Cualquier función (incluidos los constructores & 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.

+0

Esto no aborda mi pregunta. Pregunto si el constructor/destructor generado por el compilador predeterminado está en línea. –

+0

@Joseph Garvin: Creo que eso variará de compilador a compilador y, ¿cómo afecta la forma en que escribes tus implementaciones? –

+0

@ Alles: edité mi pregunta para incluir una forma en que podría importar en la parte inferior. –

1

Varía en 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.

+0

No, el estándar requiere que estén en línea. –

+2

@Gene, no el estándar requiere que estén 'en línea', que no es lo mismo. –

Cuestiones relacionadas