首页
学习
活动
专区
工具
TVP
发布

GCC -O2 踩坑指南:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around)

4.1.4 GCC 开启 -O2编译优化,避免严格别名 Bug 的方法 推荐处理顺序为从左到右: 改代码 > -fno-strict-aliasing > 不开 GCC -O2 优化 > -Wno-strict-aliasing...(掩耳盗铃,强烈不建议) Linux 内核的做法是: 在开启 GCC -O2 编译优化的同时开启 `-fno-strict-aliasing` 编译参数。...其实如果按照 GCC 那帮人的严格别名(Strict Aliasing)标准,Linux 代码有一半都跑不起来。...在 GCC 开启 -O2 -fwrapv 或 -O2 -fno-strict-overflow 编译参数后,输出结果为: 2147483647 0 -fwrapv 编译选项指示 GCC 编译器假定加法...而在 GCC 开启 -O2 -fwrapv 编译参数时,循环将在执行 INT_MAX 次后停止。

23310
您找到你想要的搜索结果了吗?
是的
没有找到

GCC -O0 -O1 -O2 -O3 四级优化选项

当设置 O2 选项时,编译器并不进行循环打开()loop unrolling 以及函数内联。与 O1 比较而言,O2 优化增加了编译时间的基础上,提高了生成代码的执行效率。...-O3(臭氧优化) 比 O2 更进一步的进行优化。 在包含了 O2 所有的优化的基础上,又打开了以下优化选项: l -finline-functions:内联简单的函数到被调用函数中。...打开了大部分 O2 优化中不会增加程序大小的优化选项,并对程序代码的大小做更深层的优化。...O2 会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。 O3 在 O2 的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。...2.内存操作顺序改变所带来的问题:在 O2 优化后,编译器会对影响内存操作的执行顺序。

3.2K30

宋宝华: 关于Linux编译优化几个必须掌握的姿势

01 编译选项和内核编译 首先我们都知道,Linux内核如果用O0编译,是无法编译过的,Linux的内核编译,要么是O2,要么是Os,这点从Linux的Makefile里面可以看出: ?...O2和Os都使能了inline small函数和called once的函数,但是O2里面-finline-functions是关闭的,而Os里面是开的。...编译,则没有问题: $ gcc -O2 cc.c 原因在于,O2编译,它意识到a==1,所以if(a>2),它不会成立,所以f()没有定义也没有关系。...O2可以编译过的代码进行如下修改: ?...总结的话 下面给几条实践指南: 尽量不要尝试用O0去编译内核,这不符合真实的工程实践,也不太被主流Linux社区所支持;内核依赖O2/Os去做较多的优化; 追求你的代码在O2的情况下,仍然是正确的,代码要经得起编译优化

2.8K20
领券