Car*_*arl 8 c++ performance exception
例如,我正在编写一个多线程时间关键型应用程序,可以实时处理和流式传输音频.音频中断是完全不可接受的.这是否意味着我不能使用STL,因为抛出异常时可能会减慢速度?
Gre*_*ers 28
通常,如果new失败,STL容器自己抛出的唯一异常是std :: bad_alloc.唯一的其他时间是用户代码(例如构造函数,赋值,复制构造函数)抛出的时间.如果你的用户代码永远不会抛出,那么你只需要防止新的投掷,你最不可能必须这样做.
其他可以抛出异常的东西: - at()函数可以抛出std :: out_of_range,如果你访问它们超出范围.无论如何,这是一个严重的程序错误.
其次,例外并不总是很慢.如果您的音频处理中发生异常,可能是因为您需要处理的严重错误.错误处理代码可能比异常处理代码要昂贵得多,以便将异常传输到catch站点.
在前面的答案中没有明确写出来,所以:
是否使用STL不会删除释放您分配的对象资源的RAII代码.
例如:
void doSomething()
{
MyString str ;
doSomethingElse() ;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,编译器将生成释放MyString资源的代码(即调用MyString析构函数),无论同时发生什么,包括doSomethingElse是否抛出异常,或者之前是否返回"返回"功能范围的结束.
如果您遇到问题,那么您应该修改自己的思维方式,或者尝试C.
但是,只有在以下情况下才会发送异常:
这里的关键字是"例外",这很好,因为我们正在讨论"异常"(参见模式?).
在你的情况下,如果你抛出一个异常,很可能会发生很糟糕的事情你的程序无论如何都会崩溃.
在这种情况下,您的问题不是处理性能损失.它是处理错误的优雅处理,或者更糟糕的是,优雅地终止程序(包括"对不起"消息框,将未保存的数据保存到临时文件中以便以后恢复,等等).
这意味着(除非在非常特殊情况下),不要将异常用作"返回数据".当发生非常糟糕的事情时抛出异常.只有在知道如何处理异常时才捕获异常.避免尝试/捕获(除非您知道如何处理异常).
现在我们知道了:
我们应该讨论STL:
STL(如果可能的话)通常会验证你是否做错了.如果你这样做,它将抛出异常.尽管如此,在C++中,你通常不会支付你不会使用的东西.
一个例子是访问矢量数据.
如果你知道你不会超出范围,那么你应该使用运算符[].
如果您知道不会验证边界,那么您应该使用()处的方法.
例A:
typedef std::vector<std::string> Vector ;
void outputAllData(const Vector & aString)
{
for(Vector::size_type i = 0, iMax = aString.size() ; i != iMax ; ++i)
{
std::cout << i << " : " << aString[i] << std::endl ;
}
}
Run Code Online (Sandbox Code Playgroud)
例B:
typedef std::vector<std::string> Vector ;
void outputSomeData(const Vector & aString, Vector::size_type iIndex)
{
std::cout << iIndex << " : " << aString.at(iIndex) << std::endl ;
}
Run Code Online (Sandbox Code Playgroud)
示例A"信任"程序员,并且在验证中没有时间丢失(因此,如果出现错误,则当时抛出异常的可能性较小......这通常意味着错误/异常/崩溃通常会发生之后,这将无助于调试,并会让更多数据被破坏).
示例B要求向量验证索引是否正确,如果没有则抛出异常.
这是你的选择.
归档时间: |
|
查看次数: |
1561 次 |
最近记录: |