Digamos que tengo esta pequeña función en un archivo fuente
static void foo() {}
y construyo una versión optimizada de mi binario, pero no quiero que esta función esté incorporada (para fines de optimización). ¿Hay una macro que pueda agregar en un código fuente para evitar la inserción?
Respuestas:
Desea el atributo
gcc
específiconoinline
.Úselo así:
fuente
GCC tiene un interruptor llamado
-fno-inline-small-functions
Así que utilízalo cuando invoques gcc. Pero el efecto secundario es que todas las demás funciones pequeñas tampoco están alineadas.
fuente
-fno-inline
no funciona en absoluto.gdb
aún ingresa métodos en el paso a paso. Algo está roto y dudo que lo estégdb
.Una forma portátil de hacer esto es llamar a la función a través de un puntero:
Aunque esto produce diferentes instrucciones para ramificar, lo que puede no ser su objetivo. Lo que trae un buen punto: ¿cuál es su objetivo aquí?
fuente
Sé que la pregunta es sobre GCC, pero pensé que podría ser útil tener información sobre compiladores y otros compiladores también.
El
noinline
atributo de función de GCC también es bastante popular entre otros compiladores. Es apoyado por al menos:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)Además, MSVC admite
__declspec(noinline)
volver a Visual Studio 7.1. Intel probablemente también lo admite (intentan ser compatibles tanto con GCC como con MSVC), pero no me he molestado en verificarlo. La sintaxis es básicamente la misma:PGI 10.2+ (y probablemente más antiguo) admite un
noinline
pragma que se aplica a la siguiente función:TI 6.0+ admite un
FUNC_CANNOT_INLINE
pragma que (molestamente) funciona de manera diferente en C y C ++. En C ++, es similar a los IGP:En C, sin embargo, se requiere el nombre de la función:
Cray 6.4+ (y posiblemente antes) adopta un enfoque similar, que requiere el nombre de la función:
Oracle Developer Studio también admite un pragma que toma el nombre de la función, volviendo al menos a Forte Developer 6 , pero tenga en cuenta que debe venir después de la declaración, incluso en versiones recientes:
Dependiendo de lo dedicado que esté, podría crear una macro que funcionaría en todas partes, pero necesitaría tener el nombre de la función y la declaración como argumentos.
Si, OTOH, estás de acuerdo con algo que simplemente funciona para la mayoría de las personas, puedes salirte con la tuya con algo que es un poco más estéticamente agradable y que no requiere repetirse. Ese es el enfoque que he tomado para Hedley , donde la versión actual de HEDLEY_NEVER_INLINE se ve así:
Si no desea utilizar Hedley (es un solo dominio público / encabezado CC0), puede convertir la versión que comprueba las macros sin demasiado esfuerzo, pero más de lo que estoy dispuesto a poner ☺.
fuente
En caso de que obtenga un error del compilador
__attribute__((noinline))
, simplemente puede intentar:fuente
Esto es lo que funcionó para mí.
fuente
Usa el
noinline
atributo :Probablemente deberías usarlo tanto cuando declaras la función para uso externo como cuando escribes la función.
fuente
Yo trabajo con gcc 7.2. Específicamente, necesitaba una función que no estuviera en línea, porque tenía que ser instanciada en una biblioteca. Intenté la
__attribute__((noinline))
respuesta, así como laasm("")
respuesta. Ninguno de los dos resolvió el problema.Finalmente, pensé que definir una variable estática dentro de la función forzaría al compilador a asignarle espacio en el bloque de variables estáticas y a emitir una inicialización cuando se llama por primera vez a la función.
Este es un truco sucio, pero funciona.
fuente
inline void foo(void) { ... }
en un encabezado y declararlaextern inline void foo(void);
en un archivo fuente de la biblioteca. Siguiendo la semántica de C99, el compilador podría alinear la función cuando le plazca Y emitir código objeto en su biblioteca. Ver ¿Es útil "en línea" sin "estático" o "externo" en C99? .