c++ - español - funciones en arduino



¿Cómo sabré si la función en línea realmente se reemplaza en el lugar donde se llama o no? (6)

Sé que la función en línea se reemplaza cuando se llama o se comporta como una función normal.

¿Pero cómo sabré si la función en línea se reemplaza realmente en el lugar donde se llama o no como decisión de tratar la función en línea, ya que la línea está en el momento de la compilación?

https://src-bin.com


Answer #1
  1. ver el tamaño de los archivos objeto, son diferentes entre inline y inlined
  2. use nm "obj_file" | grep "fun_name", también son diferentes
  3. gcc -Winline -O1
  4. comparar con el código de ensamblaje

Answer #2

Con gdb, si no puede llamar a una función, uno de sus posibles significados es que la función está en línea. Cambiando el razonamiento, si puede llamar a una función dentro de gdb, significa que la función no está marcada en línea.


Answer #3

Las respuestas anteriores son muy útiles, solo estoy agregando algún punto que tenemos en mente mientras escribimos la función en línea.

Recuerde, incluir en línea es solo una solicitud al compilador, no un comando. El compilador puede ignorar la solicitud de alineación. El compilador no puede realizar inline en circunstancias tales como :

1) Si una función contiene un bucle. (para, mientras, do-while)

2) Si una función contiene variables estáticas.

3) Si una función es recursiva.

4) Si un tipo de devolución de función es distinto de vacío, y la declaración de devolución no existe en el cuerpo de la función.

5) Si una función contiene instrucción switch o goto.

Información completa: https://www.geeksforgeeks.org/inline-functions-cpp/


Answer #4

Programativamente en tiempo de ejecución, no puede.
Y la verdad del asunto es: no necesitas saber

Un compilador puede elegir inline funciones que no están marcadas en inline o ignorar funciones marcadas explícitamente en inline , es completamente el deseo (leer sabiduría ) del compilador y debe confiar en que el compilador haga su trabajo con criterio. La mayoría de los compiladores convencionales harán su trabajo muy bien.

Si su pregunta es puramente desde un punto de vista académico, entonces hay un par de opciones disponibles:

Analizar el código de ensamble generado:

Puede verificar el código de ensamblaje para verificar si el código de función está insertado en el punto de llamada.

¿Cómo generar el código de ensamblaje?

Para gcc:
Use el interruptor -S durante la compilación.
Por ejemplo:

g++ -S FileName.cpp

El código de ensamblado generado se crea como archivo FileName.s .

Para MSVC:
Use el modificador / FA desde la línea de comando.

En el código de ensamblaje generado, busque si hay una instrucción de ensamblaje de call para la función en particular.

Use advertencias y diagnósticos específicos del compilador:

Algunos compiladores emitirán una advertencia si no cumplen con una solicitud de función en línea.
Por ejemplo, en gcc, la opción de comando -Winline emitirá una advertencia si el compilador no alinea una función que fue declarada en línea.

Verifique la documentación de GCC para más detalles:

-Winline

Advierta si una función que está declarada como en línea no puede estar en línea. Incluso con esta opción, el compilador no advierte sobre fallas en las funciones en línea declaradas en los encabezados del sistema.

El compilador usa una variedad de heurísticas para determinar si alinea o no una función. Por ejemplo, el compilador tiene en cuenta el tamaño de la función que se incluye y la cantidad de alineación que ya se ha realizado en la función actual. Por lo tanto, cambios aparentemente insignificantes en el programa de origen pueden causar que las advertencias producidas por -Winline aparezcan o desaparezcan.


Answer #5

Si necesita asegurarse de que la función está en línea y está bien para ir con extensión propietaria en MS VC ++, consulte el __forceinline declarator . El compilador alineará la función o, si entra en la lista de casos especiales documentados, recibirá una advertencia, por lo que sabrá el estado en línea.

No lo aprueba de ninguna manera.


Answer #6

Verifica el código generado Si la función se expande, verá su cuerpo, a diferencia de una call o instrucción similar.





inline