que proceso para funciona ejecutar configurar compilar compilador compilacion como comando c++ inline tdm-mingw

proceso - Funciones en línea de C++ usando GCC: ¿por qué el CALL?



proceso de compilacion gcc (7)

He estado probando llamadas de función 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 ++ wirtes:

El especificador en línea es una sugerencia 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 realizar la llamada a través del mecanismo de llamada de función habitual.

Sin embargo, he descubierto que el código generado simplemente no está en línea. Hay una instrucción CALL para la función isquare .

¿Por qué está pasando esto? ¿Cómo puedo usar las 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


¿Estás viendo una construcción de depuración (optimizaciones desactivadas)? Los compiladores generalmente deshabilitan el ingreso en las compilaciones de "depuración" porque hacen que la depuración sea más difícil.

En cualquier caso, la inline especificada es de hecho una sugerencia . El compilador no es necesario para alinear la función. Hay una serie de razones por las que cualquier compilador puede decidir ignorar una sugerencia en línea:

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

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

Como está usando Gcc, puede forzar en línea con el atributo __ ((siempre_inline)).

Ejemplo:

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

Fuente: GCC documentos en línea


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


Es una sugerencia y el complaciente puede optar por ignorar la sugerencia. Creo que leí algo donde GCC generalmente lo ignora. Recuerdo que había una bandera pero aún no funciona en el 100% de los casos. (No he encontrado un enlace todavía).

Indicador: -finline-functions está activada en el nivel de optimización -O3.


Inline no es más que una sugerencia para el compilador de que, si es posible alinear esta función, entonces el compilador debería considerar hacerlo. Algunas funciones se integrarán automáticamente porque son tan simples, y otras funciones que usted sugiere que no lo son porque son demasiado complejas.

Además, me di cuenta de que estás haciendo una versión de depuración. Realmente no lo sé, pero es posible que el compilador deshabilite la integración de las versiones de depuración porque dificulta las cosas para el depurador ...


No hay una forma genérica de C ++ para FORZAR al compilador a crear funciones en línea. Anote la palabra ''sugerencia'' 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 TENDRÁ que usar macros en lugar de funciones.

EDIT: njsf da la palabra clave gcc adecuada en su respuesta.


Ya sea en línea depende del compilador. ¿Es gratis ignorar la pista en línea ? Algunos compiladores tienen una palabra clave específica (como __forceinline en VC ++) pero incluso con una palabra clave virtual, las llamadas a funciones de miembro virtual no estarán en línea.