C ++可选vs throw

时间:2018-02-11 06:58:24

标签: c++

当预期返回值可能存在或不存在时,更可能使用可选项。 另一方面的例外是在发生“意外”事件时使用,需要捕获以防止系统崩溃。

除了这些选项的功能和优雅,只关注性能,哪些代码在下面的天真例子中有更好的表现?

在我的项目中需要注意的重要事项是,总是可以找到密钥,如果不是,我会有很大的不一致性,程序需要采取多项措施......

可选示例:

optional<MyObject> LookUp(const string& Key) {
    if (Key_found())
        return theObj;
    else
        return {};
}

int main() {
    ...
    while(true) {
        ...
        optional<MyObject> MyObj = LookUp(Key);
        if (MyObj)
            //work with MyObj
        else
            FixInconcistency();
    }
}

抛出示例:

 MyObject LookUp(xonst string& Key) {
     if (Key_found())
        return the Obj;

     throw;                              //Just throw without any information
 }

 int main() {
     ...
     while(true) {
         ...
         try {
             MyObject MyObj = Lookup(key);
             //work with MyObj
         } catch (...) {
             FixInconcistency();
         }
    }
 }

1 个答案:

答案 0 :(得分:1)

正如其他人所说,两个版本之间的差异在于代码的含义,而不是其性能。我从你已经意识到的问题中了解到,所以我会按照要求回答这个问题。

哪一项效果更好取决于Key_found返回false的概率。

C ++中的异常是在考虑到一个目标的基础上构建的 - 让非投掷案例尽可能便宜,理解是它们在特殊情况下被抛出。

因此,如果Key_found的概率真的很低,那么将复合类型返回到一个简单的方法上的额外开销会使第二种形式更便宜(假设,MyObjectKey_found事实上,简单。否则,应该没什么区别。)

另一方面,如果catch(...)的概率不是那么低,反复展开堆栈的成本会高得多。

像往常一样,最好的答案是基准。

作为旁注,异常的主要优点是您不必显式处理内联的异常情况,并且您不需要通过展开来传播它。以你在这里的方式使用它没有多大意义。

此外,投掷样本有一堆问题。特别是,什么都不做就没有做到你认为它做的事情,没有重新抛出的$('#settlement_details').keyup(function (e) { updateCount($(this)); // updates the character count inside my textarea to a div }); 真的坏主意。