You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用gcc编译参数-fno-exceptions是否会减小可执行二进制文件的体积?

关于GCC -fno-exceptions参数相关问题解答

问题a解答

该说法不完全正确:

  • 如果你的代码本身完全不涉及try/catch/throw关键字,也没有定义带非平凡析构函数的对象,那么-fno-exceptions确实只会起到禁止你在代码中使用异常相关关键字的作用,生成的二进制体积和开异常时没有差异,你测试的简单C++程序就是这种情况。
  • 如果你代码中原本就用到了异常结构,或者存在需要栈展开的析构逻辑,开启-fno-exceptions后编译器会跳过生成栈展开所需的CFI信息、异常表条目,这时候生成的二进制体积会明显更小。

问题b解答

该说法完全正确:
-fno-exceptions的作用范围仅限定于当前编译的用户代码,不会影响已经编译好的libstdc库的行为。如果系统自带的libstdc是默认开启异常编译的,那么你调用的std::vector::at()等标准库函数还是会正常抛出异常,而你的用户代码因为没有异常处理逻辑,异常抛出后会直接触发std::terminate终止程序运行。

问题c解答

该说法不完全正确:
默认开启-fexceptions时,即使你没有主动写try/catch/throw代码,只要你定义了带非平凡析构函数的对象,编译器依旧需要生成对应的栈展开信息,确保异常从更深层的函数抛出时能正确调用这些对象的析构函数,这部分信息依旧会占用二进制体积。只有当你的代码既没有任何异常相关操作,也没有需要栈展开的析构逻辑时,才不会产生额外的体积开销。

你之前的推测是正确的,官方手册提到的7%体积开销是包含libstdc在内的整体统计值,只有使用-fno-exceptions重新编译整个libstdc,才能去掉标准库中所有异常相关的代码、栈展开信息,获得明显的体积优化,单独给用户代码加-fno-exceptions能获得的优化幅度非常有限。

内容的提问来源于stack exchange,提问作者Angle.Bracket

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 10:24:03