GCC-O2踩坑指南:严格别名(Strict Aliasing)与整数环绕(Integer Wrap-around) 4、违反严格别名规则 下面我们举几个例子,在GCC开启 -O2优化时,违反严格别名规则导致的未定义行为。...4.1.4GCC开启 -O2编译优化,避免严格别名 Bug的方法 推荐处理顺序为从左到右: 改代码 > -fno-strict-aliasing > 不开GCC-O2优化...
GCC -O2, -O3, -Os 编译优化选项下,严格别名(strict aliasing)规则默认开启。 具体的各个编译优化等级的优化参数,参考如下 GCC 手册:Options That Control Optimization 默认情况下无论是在 GCC -O0, -O1 优化下开启 -fstrict-aliasing,还是开启 GCC -O2, -O3, -Os 优化,如果想让违反严格别名规则代码在编译...
并且把获取最快的编译速度作为它的目标。 当优化标识被启用之后,gcc编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源程序语义等价的前提之下),以满足某些目标,如:代码大小最小或运行速度更快(只不过通常来说,这两个目标是矛盾的,二者不可兼得)。 在不同的gcc配置和目标平台下,同一个标识所采用的优...
并且把获取最快的编译速度作为它的目标。 当优化标识被启用之后,gcc编译器将会试图改变程序的结构(当然会在保证变换之后的程序与源程序语义等价的前提之下),以满足某些目标,如:代码大小最小或运行速度更快(只不过通常来说,这两个目标是矛盾的,二者不可兼得)。 在不同的gcc配置和目标平台下,同一个标识所采用的优...
-O2是平衡编译时间和运行效率的常用选择,适用于绝大多数情况。 3.-O3优化等级 -O3优化是GCC中最高级别的标准优化。除了包括-O2级别的所有优化外,-O3引入了更多高级优化技术,如: 向量化:利用SIMD指令并行处理数据。 高级内联:更激进的函数内联策略。 代码重新排列:优化代码布局以提升缓存利用率。 -O3优化着重于最...
这样修改以后无论是普通编译还是-O2编译都可以正常输出。总结:优点: 改动小,完全符合常规思维。缺点:...
-O2 优化更多。 GCC 执行几乎所有支持的优化,不涉及空间速度折衷。当您指定 -O2 时,编译器不会执行循环展开或函数内联。与 -O 相比,此选项增加了编译时间和生成代码的性能。 -O3 优化更多。 -O3 打开 -O2 指定的所有优化,同时打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after...
进入到-O2级别,编译器将采用更复杂的策略来进一步提升性能,此时会更加注重代码执行的速度。 进一步的函数内联:除了基本的函数内联之外,-O2会尝试更多的内联操作以减少函数调用的开销。 更智能的循环处理:加强对循环的优化,如循环展开、循环融合等,以减少循环的开销。
gcc -O0 -O1 -O2 -O3 -Os 编译优化等级 GCC提供了大量优化等级,用来对编译时间、目标文件大小、执行效率三个维度进行不同的取舍和平衡 -O0,最少的优化。(这是默认的编译选项)(可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处)...
编译 gcc -Wall -g -o fpu fpu.c -mfpmath=387 -O2 -m32 运行 $ ./fpu 10 (a == b...