gcc 编译优化

优化选项集合

man gcc 去查
-O  -O0  -O1  -O2  -O3  -Os  -Ofast  -Og

Options That Control Optimization
  • 具体是哪些集合
-Ox 是 一些优化选项的集合

// 注意 : -O 本身就是一个集合 , 集合了 -fxxx -fno-yyy 这些优化选项
gcc -c -Q -O2 --help=optimizers

可通过这个验证
	-O2 -O0 同时使用的时候 , 命令行参数最后面的有效
	从O0到O1,O2,O3,是一个开启的优化选项逐步加大的过程
  • 优化方向
二进制指令占用空间少 : -Osx 
运行速率快 : -Ox

二进制指令占用空间少 做到极致 并不意味着 运行速率比较快
运行速率快			做到基址 并不意味着 "二进制指令占用空间少"

实际的优化往往在这两者间取舍!

优化选项集合对比

// 整体上,优化越来越大
无Ox -O0
-Og
-O -O1
-Os
-O2
-O3
-Ofast
-Ox 是 一些优化选项的集合
  • 无Ox
-O0 效果一样
  • 多个 Ox
如果您使用多个-O选项,不管有没有级别编号,最后一个这样的选项是有效的。
  • O0
减少了编译时间,使调试产生了预期的结果。这是默认设置。

在没有任何优化选项的情况下,编译器的目标是降低编译成本,并使调试产生预期的结果。
语句是独立的:
  如果在语句之间使用断点停止程序,则可以为任何变量指定一个新值,或将程序计数器更改为函数中的任何其他语句,并从源代码中获得预期的结果。

启用优化标志会使编译器试图提高性能和/或代码大小,但会以牺牲编译时间和调试程序的能力为代价。

  • Og
  应该是标准编辑编译调试周期的优化级别选择,提供合理的优化级别,同时保持快速编译和良好的调试体验。
  
  在生成可调试代码时,它比-O0更好,因为某些收集调试信息的编译器过程在-O0处被禁用。

  与-O0类似,-Og完全禁用了许多优化过程,因此控制它们的单个选项没有效果。
  除此之外,-Og将启用所有-O1优化标志,但可能干扰调试的标志除外:
     -fbranch-count-reg  -fdelayed-branch -fif-conversion  -fif-conversion2 -finline-functions-called-once
     -fmove-loop-invariants  -fssa-phiopt -ftree-bit-ccp  -ftree-pta  -ftree-sra
  • O
-O1 效果一样
  • O1
优化编译需要更多的时间,对于一个大函数来说,需要更多的内存。
使用-O1,编译器试图减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。
-O1打开以下优化标志:
  • Os
优化大小 
除了那些经常增加代码大小的优化外,Os支持所有O2优化:
  • O2
优化甚至更多。
GCC执行几乎所有不涉及空间速度权衡的受支持优化。
与-O1相比,此选项增加了编译时间和生成代码的性能。
-O2打开-O1指定的所有优化标志。它还打开以下优化标志:
  • O3
-O3打开-O2指定的所有优化,并打开以下优化标志:
  • Ofast
无视严格的标准遵从性
-Ofast支持所有O3优化。
它还支持对所有标准兼容程序无效的优化。

具体的优化选项

Options of the form -fflag specify machine-independent flags.  
-fflag 可以指定 machine-independent 的优化选项
Most flags have both positive and negative forms; 
大多数flag有正面和负面两种形式
the negative form of -ffoo is -fno-foo.   // -fxxxx -fno-xxxx
In the table below, only one of the forms is listed---the one you typically use.  
You can figure out the other form by either removing no- or adding it.

The following options control specific optimizations. 
以下选项控制特定的优化
They are either activated by -O options or are related to ones that are. 
它们要么由-O选项激活,要么与其他选项相关。
You can use the following flags in the rare cases when "fine-tuning" of optimizations to be performed is desired. 
在需要对优化进行“微调”的极少数情况下,可以使用以下标志。

-fno-defer-pop 			// -fdefer-pop 
-fforward-propagate 	// -fno-forward-propagate 
...

优化了什么

指导了编译过程 // .C -> .asm 的过程
影响了 .asm 的生成
会造成
	1. 指令的合并(包括 mem操作的合并)
	2. mem操作的省略
	3. 指令序列(program order)的混乱

怎么拒绝优化

compile optimizer & barrier
1. 拒绝优化函数
	optimize("O0") 会保证其不被优化,更不会内联
	static void __attribute__((optimize("O0"))) foo(void){};
2. 拒绝优化变量
	前后调用__asm__ __volatile__ ("": : :"memory")
	前后调用函数
	变量用volatile修饰
		变体1 : int a; *(volatile int *)(&a)

实例:
	https://gitee.com/suweishuai/baremetal/commit/6f810e25d52b1b5c9e66ae121ec39defe201bcbb
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值