避免使用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无法编译通过。
父主题: C++语言