鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

避免使用try catch异常处理

【说明】 采用C++语言开发性能敏感项目,可以考虑从编译器层面关闭try catch的异常处理机制,避免由此带来的开销;实践方面,如果采用gcc编译器,可以采用-fno-exceptions关闭异常机制;另外,C++的异常处理机制整体的使用成本较高,使用不当还会破坏程序代码的结构化,造成可维护性风险。

【原理】 一旦使用了异常处理机制(如函数内置了try语句块等),编译器会在调用链的代码段中引入异常管理的数据开销,用于保证异常发生后,程序能够通过stack unwind(栈回退)机制逐级完成对函数内部的资源回收;与之相应地,在运行期内程序栈上会增加异常管理结构的空间开销与时间开销,对于性能敏感函数,可能会造成整体的性能恶化;

【注意事项】 不涉及

【案例】

优化前
// input.cpp
void TestFunc()
{
    int *a = nullptr;
    try {
        a = new int;
    } catch(...) {
        return;
    }
    *a = 10;
    delete a;
}
g++ input.cpp -o output -Wall

说明:上述编译命令将input.cpp编译成output可执行程序,按照默认选项配置,未禁用异常捕获机制。

优化后

g++ input.cpp -o output -Wall -fno-exceptions
// 编译结果输出
...\input.cpp: In function 'void TestFunc()':
...\input.cpp:16:11: error: exception handling disabled, use -fexceptions to enable
     catch(...) {

说明: 优化后的编译命令,将异常捕获机制禁用,因此input.cpp无法编译通过。