Aparte de lo obvio (-Os -s
), alinear las funciones al valor más pequeño posible que no se bloquee (no conozco los requisitos de alineación de ARM) podría exprimir algunos bytes por función.
-Os
debe desactivar las funciones de alineación, pero esto aún puede tener un valor predeterminado de 4 u 8. Si se alinea, p. a 1 es posible con ARM, que podría salvar algunos bytes.
-ffast-math
(o el menos abrasivo -fno-math-errno
) no establecerá errno y evitará algunas comprobaciones, lo que reduce el tamaño del código. Si, como la mayoría de las personas, no lee errno de todos modos, esa es una opción.
El uso correcto de __restrict
(o restrict
) y const
elimina las cargas redundantes, haciendo que el código sea más rápido y más pequeño (y más correcto). Marcar correctamente las funciones puras como tal, elemina las llamadas de función.
Activación LTO puede ayudar, y si eso no está disponible, la compilación de todos los archivos de origen en un sistema binario de una sola vez (gcc foo.c bar.c baz.c -o program
en lugar de compilar foo.c
, bar.c
y baz.c
a los ficheros objeto primero y luego vincular) tendrá un efecto similar . Hace que todo sea visible para el optimizador a la vez, posiblemente permitiendo que funcione mejor.
-fdelete-null-pointer-checks
puede ser una opción (tenga en cuenta que esto normalmente está activado con cualquier "O", pero no de objetivos embebidos).
Poniendo globales estáticos (esperemos que no tenga tantos, pero aún así) en una estructura puede eleminar un montón de sobrecarga inicializándolos. Aprendí eso al escribir mi primer cargador OpenGL. Tener todos los punteros de función en una estructura e inicializar la estructura con = {}
genera una llamada a memset
, mientras que inicializar los punteros de la "forma normal" genera cien kilobytes de código para establecer cada uno a cero individualmente.
Evitar no trivial-constructor estático locales variables como el diablo (POD tipos no son un problema). Gcc inicializará locales no estáticos constructores triviales threadsafe a menos que compile con -fno-threadsafe-statics
, que vincula mucho de código adicional (incluso si no usa subprocesos en absoluto).
Usando algo como libowfat en lugar del crt normal puede enormemente reducir su tamaño binario.
¿Qué te hace pensar que es demasiado grande? – bdonlan
En algunos dispositivos incrustados como enrutadores que funcionan con OpenWrt con solo almacenamiento flash de 4MB ... – felix021