我最近开始在一些项目中使用C++11,并且也开始大量使用stl容器,对于它们我还比较新手。
我最近编写了一个函数,其功能类似于:
CMyClass* CreateAndOrGetClass( int _iObjectId, std::map<int, CMyClass*>& _mapObjectData )
{
CMyClass* pClassInstance{ nullptr };
try
{
pClassInstance = _mapObjectData.at( _iObjectId);
}
catch ( ... )
{
pClassInstance = new CMyClass();
__mapObjectData.insert( _iObjectId, pClassInstance );
}
return ( pClassInstance );
}
我的问题是关于使用异常处理非“异常”情况。这似乎是实现目的的简洁方法,而不需要涉及迭代器的设置。
在使用异常处理此类目的时,是否存在任何需要注意的问题我可能会忽略?
* 测试结果:
为了进一步说明,我进行了一些性能测试,将基于异常处理的代码与所选答案中的代码示例进行了比较。 这是一个很好的练习,有助于证明使用异常处理普通代码流程的性能建议的不良性能,并提供了一些有关未抛出异常时几乎没有性能损失的断言的参考材料。
虽然这些测试并不全面,但以下是我的观察结果:
每个测试在使用rand()作为map键源(生成最大32768个元素)的大量插入/获取操作上运行:
异常方法:平均5.99秒 查找/添加方法:平均0.75秒
将随机元素的范围扩大十倍,得到以下数字:
异常方法:平均56.7秒 查找/添加方法:平均4.54秒
然后,我预填充地图以包含所有可能的键条目,以便try永远不会抛出:
异常方法:平均0.162秒 查找/添加方法:平均0.158秒
有趣的是,在MS VStudio中,异常处理方法的调试模式代码速度更快。