当前位置:  开发笔记 > 编程语言 > 正文

如果在抛出异常时我无法承受缓慢的性能,我可以使用STL吗?

如何解决《如果在抛出异常时我无法承受缓慢的性能,我可以使用STL吗?》经验,为你挑选了3个好方法。

例如,我正在编写一个多线程时间关键型应用程序,可以实时处理和流式传输音频.音频中断是完全不可接受的.这是否意味着我不能使用STL,因为抛出异常时可能会减慢速度?



1> Greg Rogers..:

通常,如果new失败,STL容器自己抛出的唯一异常是std :: bad_alloc.唯一的其他时间是用户代码(例如构造函数,赋值,复制构造函数)抛出的时间.如果你的用户代码永远不会抛出,那么你只需要防止新的投掷,你最不可能必须这样做.

其他可以抛出异常的东西: - at()函数可以抛出std :: out_of_range,如果你访问它们超出范围.无论如何,这是一个严重的程序错误.

其次,例外并不总是很慢.如果您的音频处理中发生异常,可能是因为您需要处理的严重错误.错误处理代码可能比异常处理代码要昂贵得多,以便将异常传输到catch站点.



2> Nemanja Trif..:

如果一个STL容器抛出,你的问题可能比减速要大得多:)



3> paercebal..:

在前面的答案中没有明确写出来,所以:

C++中发生异常

是否使用STL不会删除释放您分配的对象资源的RAII代码.

例如:

void doSomething()
{
    MyString str ;
    doSomethingElse() ;
}

在上面的代码中,编译器将生成释放MyString资源的代码(即调用MyString析构函数),无论同时发生什么,包括doSomethingElse是否抛出异常,或者之前是否返回"返回"功能范围的结束.

如果您遇到问题,那么您应该修改自己的思维方式,或者尝试C.

例外应该是例外

通常,当发生异常时(仅当发生异常时),您将受到性能影响.

但是,只有在以下情况下才会发送异常:

你有一个特殊的事件要处理(即某种错误)

在非常特殊的情况下(即堆栈中多个函数调用的"大量返回",例如在执行复杂搜索时,或在线程优雅中断之前展开堆栈)

这里的关键字是"例外",这很好,因为我们正在讨论"异常"(参见模式?).

在你的情况下,如果你抛出一个异常,很可能会发生很糟糕的事情你的程序无论如何都会崩溃.

在这种情况下,您的问题不是处理性能损失.它是处理错误的优雅处理,或者更糟糕的是,优雅地终止程序(包括"对不起"消息框,将未保存的数据保存到临时文件中以便以后恢复,等等).

这意味着(除非在非常特殊情况下),不要将异常用作"返回数据".当发生非常糟糕的事情时抛出异常.只有在知道如何处理异常时才捕获异常.避免尝试/捕获(除非您知道如何处理异常).

STL怎么样?

现在我们知道了:

你仍然想使用C++

你的目标不是为了它的乐趣每一秒抛出一千个例外

我们应该讨论STL:

STL(如果可能的话)通常会验证你是否做错了.如果你这样做,它将抛出异常.尽管如此,在C++中,你通常不会支付你不会使用的东西.

一个例子是访问矢量数据.

如果你知道你不会超出范围,那么你应该使用运算符[].

如果您知道不会验证边界,那么您应该使用()处的方法.

例A:

typedef std::vector 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 ;
    }
}

例B:

typedef std::vector Vector ;

void outputSomeData(const Vector & aString, Vector::size_type iIndex)
{
   std::cout << iIndex << " : " << aString.at(iIndex) << std::endl ;
}

示例A"信任"程序员,并且在验证中没有时间丢失(因此,如果出现错误,则当时抛出异常的可能性较小......这通常意味着错误/异常/崩溃通常会发生之后,这将无助于调​​试,并会让更多数据被破坏).

示例B要求向量验证索引是否正确,如果没有则抛出异常.

这是你的选择.


抛出异常的可能性较小......这通常意味着错误/异常/崩溃通常会发生之后,这将无助于调​​试,并会让更多数据被破坏).
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有