导言


最近,使用STM32G431RBT6上基于simpleFOC库(C++编写)开发一个foc电机控制项目。STM32G431RBT6芯片的内存仅128KB,且控制板没有外部flash。如果要开发OTA升级的话,App程序的大小真的要把控得很好。废话不多说,展示一下“-fno-exceptions”的效果吧。

-fno-exceptions:禁用C++异常处理,节省大量代码空间!

没有“-fno-exceptions”

在这里插入图片描述
在这里插入图片描述
如上所示,App程序大小53884B。

有“-fno-exceptions”

在这里插入图片描述
在这里插入图片描述
如上所示,App程序大小49444B。

结论:代码缩小 = 53884B - 49444B = 4440B / 1024 = 4.335k!

一、增加“-fno-exceptions”之后,有负面影响吗?


  1. 禁用C++异常处理机制
// 以下代码将无法正常工作:
try {
    // 可能抛出异常的代码
    throw std::runtime_error("Error occurred");
} catch (const std::exception& e) {
    // 异常处理代码 - 这部分不会执行
}
  1. 标准库函数行为改变
    一些C++标准库函数在无法完成操作时会:
  • 正常情况:抛出异常
  • 使用-fno-exceptions后:调用std::terminate()直接终止程序
// 这些函数可能导致程序直接终止:
std::vector<int> vec;
int value = vec.at(100);  // 越界访问,正常会抛异常,现在直接终止

new int[1000000000];      // 内存分配失败,直接终止而非抛出bad_alloc

总之,嵌入式MCU开发不使用C++标准库,原因是内存非常有限。我也不使用try…catch这样的写法。所以,我可以放心增加“-fno-exceptions”禁用C++异常处理机制,让我的代码进一步缩小。
另外,simpleFOC库也完全不受影响。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐