2011-07-05 15 views
6

Estoy estudiando las funciones en línea en C++ y he llegado a una sección sobre las limitaciones de su uso. Dice:Veces cuando el funcionamiento en línea no se puede usar

El compilador también no puede realizar procesos en línea si la dirección de la función se toma de manera implícita o explícita .

¿Puede alguien explicarme, quizás con algún tipo de ejemplo, qué significa exactamente?

+3

Oh Odio este nuevo sistema gratuito de votos negativos. ¿Qué demonios estaba mal con esta pregunta, gente? –

+0

Por curiosidad, ¿qué libro está haciendo esa afirmación? –

+1

+1 para contrarrestar anónimo drive-by downvoter –

Respuesta

5

Hay dos decisiones separadas un poco el compilador hace en relación con la función de procesos en línea:

  • si se colocarán en línea una llamada función particular;
  • si existe una versión no en línea de la función.

El primero es decidido por el compilador caso por caso, si la línea es posible en ese momento. No será posible si la función es virtual, o se llama a través de un puntero de función, y no puede determinar en tiempo de compilación a qué función se llamará. No será posible si la definición no está disponible para el compilador, quizás porque está definida en una unidad de traducción diferente y el compilador no hace "optimización de todo el programa". La decisión puede estar o no influenciada por si la función está declarada inline y otros factores, como su tamaño y la frecuencia de su llamada.

El segundo depende de si se requiere una versión no en línea. Será necesario si alguna llamada no está en línea. También será necesario (según su presupuesto) si algo necesita la dirección de la función, ya que debe tener una dirección. Esto puede suceder directamente (por ejemplo, asignando la dirección a un puntero de función) o indirectamente (por ejemplo, las funciones virtuales necesitarán su dirección almacenada en algún lugar para buscar el tiempo de ejecución de acuerdo con el tipo dinámico del objeto).

La existencia de la versión no en línea no evitará que se inline ninguna llamada particular a la función, aunque es posible que pueda influir en la decisión del compilador, especialmente si está configurado para optimizar el tamaño del código.

En resumen, su presupuesto es simplista y no del todo exacto; el compilador aún puede "ejecutar en línea" si se toma la dirección, simplemente no puede omitir la versión que no está en línea.

+0

Gracias, su ejemplo de asignación de una dirección a un puntero de función realmente ayuda a entender lo que significa esta afirmación. –

4

Simplemente está mal: la capacidad de alinear una llamada de función no se ve afectada al calcular 2 + 2 o al tomar la dirección de la función en algún lugar.

¿Qué libro o artículo estás leyendo?

Por otro lado, si se toma la dirección, puede ser prácticamente imposible eliminar la función de código de máquina por separado.

Saludos & HTH.,

+0

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter09_009.html –

+0

Oh, "Pensando en C++" de Bruce Eckel. Bueno, un buen número de errores en ese libro han surgido a lo largo de los años. Pero, por lo que sé, Bruce nunca ha corregido nada. Entonces, solo ten cuidado Escribe algunas cosas buenas para principiantes, pero también escribe cosas sin sentido e incorrectas. Como lo hizo aquí. –

+0

Justo cuando menciona errores, en una pregunta del libro, le pedirá que haga una clase en un archivo de encabezado que contenga una función en línea llamada imprimir. Sin embargo, en la solución de libros solo tiene la declaración print() en el encabezado y su definición en un archivo separado. ¿Estoy en lo cierto al decir que esto también es un error y que si quiero una función en línea en un archivo de encabezado debe incluir tanto la definición como la declaración para que sea una función en línea? –

6

Puede marcar cualquier función como en línea. Incluso una función virtual, incluso una función recursiva, incluso una función larga y corta, incluso si se toma su dirección. La principal diferencia entre una función en línea y no en línea es que la definición de la primera debe aparecer en cada unidad de traducción (también conocida como archivo fuente) en la que se usa (por eso las funciones en línea generalmente se definen en el archivo .h), mientras que este último debe definirse solo una vez. Puede usar la función en línea de cualquier manera que pueda usar una función que no esté en línea.

La parte de alineación real corresponde al compilador. Puede ignorar su solicitud si, por ejemplo, su función es recursiva o demasiado larga. Por otro lado, el compilador puede elegir alinear una función que en realidad no ha marcado como en línea.

+1

en las versiones más nuevas de GCC, hay una opción para la optimización de todo el programa, que AFAIK hará que el requisito para colocar cualquier código que espere que esté incluido en el encabezado, redundante ... – Nim

Cuestiones relacionadas