嵌入式linux开发中gcc的一些优化编译选项

-Werror

编译选项加上-Werror 遇到任何的警告工程将停止编译。

-fno-exceptions

禁用运行时类型信息。

-fno-rtti 

禁用异常机制,一般只有对程序运行效率及资源占用比较看重的场合才会使用,如果要做这两个的话最好连libstdc++和其他所有的的c++库都用这两个参数重新编译一遍,否则光是你自己的程序禁用了这两个特性,而别的库依然开着,效果就大打折扣了。

-fno-threadsafe-statics

对于在函数内部声明的static变量,编译器默认是会使得这样的static变量在初始化时是线程安全的,控制它的选项是-fno-threadsafe-statics。对于单线程程序,静态变量的保护是没有必要的,g++ 的 -fno-threadsafe-statics 选项可以禁掉该机制。

-mno-unaligned-access

禁止内存未对齐(Unaligned access ...),未对齐会导致性能降低。

-ffunction-sections -fdata-sections --gc-sections

编译的时候,把每个函数作为一个section,每个数据(应该是指全局变量之类的吧)也作为一个section,这样链接的时候,--gc-sections会把没用到的section丢弃掉,最终的可执行文件就只包含用到了的函数和数据。
也就是说,链接的单位,是函数级别,这样就能丢弃没使用的函数。如果不加-ffunction-sections选项,则默认似乎是每个源文件为一个section进行链接,这样子只要这个文件中用到了一个函数,那么所有的函数都会被链接进来。

-fstack-usage -Wstack-usage=16384 

为每一个函数输出栈使用信息,每一个源码文件生成一个.su (Stack Usage)文件, su文件中有每一个函数的栈使用信息,超过给定的值(比如16384 ),则给出警告(仅是给出警告)。下图是一个例子:

-fno-strict-aliasing

“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。 

 什么是严格别名规则?gcc对严格别名的定义: In particular, an object of one type is assumed never to reside at the same address as an object of a different type, unless the types are almost the same.
即,编译器假定相同的内存地址绝不会存放不同类型的数据,否则即破坏了严格别名规则。别名的定义可理解为:同一内存地址有不同的名称,比如:

int m = 0x20190101;
int* p1 = &m;
int *p2 = &m;
int *p3 = p2;
int n = m;

怎么解决严格别名问题?采用类型相关(type-punning),手段是采用联合体union。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值