STM32 - Embedded IDE - GCC - 在C、C++混合开发,C++编译器选项增加“-fno-exceptions“,可以进一步缩小代码的大小
摘要:禁用C++异常处理优化STM32内存占用 在STM32G431RBT6(128KB内存)上开发FOC电机控制项目时,通过添加"-fno-exceptions"编译选项禁用C++异常处理机制,使程序大小从53,884B降至49,444B,节省了4.335KB空间。该优化会禁用try-catch异常处理,并使标准库函数在失败时直接终止而非抛出异常。由于嵌入式开发通常不使用C+
·
导言
最近,使用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”之后,有负面影响吗?
- 禁用C++异常处理机制
// 以下代码将无法正常工作:
try {
// 可能抛出异常的代码
throw std::runtime_error("Error occurred");
} catch (const std::exception& e) {
// 异常处理代码 - 这部分不会执行
}
- 标准库函数行为改变
一些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库也完全不受影响。
更多推荐
所有评论(0)