寻求更多GCC非标准合规性优化标志:生成高性能/更小编译二进制文件
非标准合规的GCC编译器优化标志补充
你已经整理了一批打破C/C++标准合规性、以性能或二进制体积优先的GCC优化标志:
-ffast-math -fno-math-errno -funsafe-math-optimizations -fno-signed-zeros -fno-trapping-math -fassociative-math -freciprocal-math -ffinite-math-only -fno-rounding-math -fno-signaling-nans -fcx-limited-range -fexcess-precision=fast -fmerge-all-constants
下面是更多这类跳出标准约束的优化标志,以及它们的作用和不合规点:
整数运算类
-fno-wrapv:禁用有符号整数溢出的环绕语义。C标准规定有符号整数溢出属于未定义行为,这个标志让编译器不用考虑溢出按补码环绕的情况,能删掉冗余的溢出检查、重排运算顺序来提速,但依赖溢出环绕逻辑的代码会直接出错。-fdelete-null-pointer-checks:删除空指针检查。因为标准里空指针解引用是未定义行为,编译器会默认代码不会这么做,直接删掉空指针判断逻辑,既能缩小体积又能提速,但如果代码里有专门处理空指针的场景,优化后就会失效。
浮点运算补充
-ffp-contract=fast:允许浮点表达式的融合收缩优化,比如把a*b + c合并成一条FMA指令。这会改变浮点运算的精度和中间结果,违反C/C++标准对浮点运算顺序的严格要求,但对浮点密集型代码的性能提升很明显。
链接与符号优化类
-fno-semantic-interposition:禁用语义插入。默认GCC会考虑动态链接里全局符号被其他模块替换的可能,这个标志强制编译器假设全局符号不会被外部替换,允许对全局函数/变量做内联、常量折叠等激进优化,违反动态链接的标准语义,但能提升程序启动和运行速度,还能缩小体积。
函数与调用优化类
-fdevirtualize-speculatively:推测性去虚拟化。编译器会在没有明确证据的情况下,直接把虚函数调用替换成普通函数调用,违反C++多态的标准语义,但能消除虚调用的开销,提升性能。-funsafe-loop-optimizations:允许不安全的循环优化。编译器会假设循环不会无限执行、循环变量不会溢出或越界,基于这些假设重排循环逻辑、删掉边界检查,违反标准对循环行为的未定义处理规则,能提升循环执行效率,但依赖循环边界溢出或无限循环的代码会出错。
体积与安全相关类
-fno-stack-protector:禁用栈保护机制。栈保护是防止缓冲区溢出的安全措施,禁用后违反安全合规标准,但能缩小二进制体积、提升函数调用速度。-fomit-frame-pointer:在支持的架构上省略栈帧指针。这会破坏标准的栈回溯调试机制,违反调试相关的合规要求,但能减少寄存器占用、降低栈空间开销,提升性能并缩小体积。
内容的提问来源于stack exchange,提问作者vfjpl
相关产品推荐
相关产品推荐

