我知道有一个选项“-Os”可以“优化大小”,但它影响不大,甚至在某些情况下会增加大小:(
strip(或“-s”选项)删除调试符号表,效果很好;但它只能减少一小部分尺寸。
还有其他办法可以走得更远吗?
除了显而易见的(-Os -s
),将函数对齐到不会崩溃的最小可能值(我不知道 ARM 对齐要求)可能会挤出每个函数的几个字节。
-Os
should已经禁用对齐功能,但这可能仍然默认为 4 或 8 之类的值。 ARM 可以将其设置为 1,这可能会节省一些字节。
-ffast-math
(或磨蚀性较小的-fno-math-errno
) 不会设置 errno 并避免一些检查,从而减少代码大小。如果像大多数人一样,您无论如何也不读取 errno,那么这是一个选择。
正确使用__restrict
(or restrict
) and const
消除冗余负载,使代码更快、更小(并且更正确)。正确地标记纯函数可以消除函数调用。
启用 LTO 可能会有所帮助,如果不可用,请将所有源文件一次性编译为二进制文件(gcc foo.c bar.c baz.c -o program
而不是编译foo.c
, bar.c
, and baz.c
首先到目标文件,然后链接)将具有类似的效果。它使优化器一次性看到所有内容,从而可能使其更好地工作。
-fdelete-null-pointer-checks
可能是一个选项(请注意,通常使用任何“O”启用此选项,但是not在嵌入式目标上)。
将静态全局变量(希望没有那么多,但仍然)放入结构中可以消除很多开销初始化它们。我在编写第一个 OpenGL 加载程序时了解到了这一点。将所有函数指针放在一个结构中并使用以下命令初始化该结构= {}
生成一个调用memset
,而初始化指针的“正常方式”会生成一百千字节的代码,只是为了将每个指针单独设置为零。
避免非平凡构造函数静态local变量就像魔鬼(POD类型没问题)。 Gcc 将初始化非平凡构造函数静态局部变量线程安全,除非您使用-fno-threadsafe-statics
,其中链接a lot额外的代码(即使您根本不使用线程)。
使用 libowfat 之类的东西代替普通的 crt 可以greatly减少二进制文件的大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)