Pregunta

He estado probando llamadas a funciones en línea en C++.

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

Stroustrup en el lenguaje de programación C++ escribe:

El especificador en línea es una pista para el compilador de que debe intentar generar código [...] en línea en lugar de establecer el código para la función una vez y luego llamar a través del mecanismo habitual de llamada a función.

Sin embargo, descubrí que el código generado simplemente no está en línea.Hay un LLAMAR instrucción para el icuadrado función.

alt text

¿Por qué está pasando esto?¿Cómo puedo usar funciones en línea entonces?

EDITAR: Las opciones de línea de comando utilizadas:

**** Build of configuration Debug for project InlineCpp ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
¿Fue útil?

Solución

No existe una forma genérica de C++ de FORZAR al compilador a crear funciones en línea.Tenga en cuenta la palabra "pista" en el texto que citó: el compilador no está obligado a escucharlo.

Si realmente tiene que hacer que algo esté en línea, necesitará una palabra clave específica del compilador, O necesitará usar macros en lugar de funciones.

EDITAR:njsf proporciona la palabra clave gcc adecuada en su respuesta.

Otros consejos

Como mencionó Michael Kohne, la palabra clave en línea es siempre una pista y GCC, en el caso de su función, decidió no incluirla.

Como está utilizando Gcc, puede forzar la integración en línea con el __attribute((always_inline)).

Ejemplo:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

Fuente:Documentos en línea de GCC

¿Estás viendo una compilación de depuración (optimizaciones deshabilitadas)?Los compiladores generalmente deshabilitan la inserción en compilaciones de "depuración" porque dificultan la depuración.

En cualquier caso, el inline especificado es de hecho un pista.No es necesario que el compilador inserte la función.Hay varias razones por las que cualquier compilador podría decidir ignorar una sugerencia en línea:

  • Un compilador puede ser simple y no admitir la inserción en línea
  • Un compilador podría usar un algoritmo interno para decidir qué incluir e ignorar las sugerencias.
    (A veces, el compilador puede hacer un mejor trabajo que usted al elegir qué incorporar, especialmente en arquitecturas complejas como IA64)
  • Un compilador podría usar su propia heurística para decidir que, a pesar de la sugerencia, la inserción no mejorará el rendimiento.

Inline no es más que una sugerencia para el compilador de que, si es posible incorporar esta función, entonces el compilador debería considerar hacerlo.Algunas funciones se incorporarán automáticamente porque son muy simples, y otras funciones que usted sugerir lo incluye, no lo hará porque son demasiado complejos.

Además, noté que estás realizando una compilación de depuración.En realidad no lo sé, pero es posible que el compilador deshabilite la inserción para compilaciones de depuración porque le dificulta las cosas al depurador...

Es una pista y el cumplidor puede optar por ignorar la pista.Creo que leí en algunos lugares que el CCG generalmente lo ignora.Recuerdo haber oído que había una bandera pero todavía no funciona en el 100% de los casos.(Aún no he encontrado el enlace).

Bandera:-finline-functions está activado en el nivel de optimización -O3.

La incorporación o no en línea depende del compilador.¿Es libre de ignorar el en línea pista.Algunos compiladores tienen una palabra clave específica (como __forceinline en VC++) pero incluso con dicha palabra clave, las llamadas virtuales a funciones miembro virtuales no estarán integradas.

Me enfrenté a problemas similares y descubrí que solo funciona si la función en línea está escrita en un archivo de encabezado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top