gpt4 book ai didi

C++ 可选与抛出

转载 作者:行者123 更新时间:2023-11-28 04:48:24 24 4
gpt4 key购买 nike

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

除了这些选项的功能和优雅以及只关注性能之外,在下面的简单示例中,哪些代码具有更好的性能?

重要的是要注意在我的项目中总是会找到一个 key ,否则我会有很大的不一致并且程序需要采取一些行动......

可选示例:

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();
}
}
}

最佳答案

正如其他人所指出的,这两个版本之间的区别在于代码的含义,而不是其性能。我从你已经知道的问题中了解到,所以我将按要求回答问题。

哪一个性能更好很大程度上取决于 Key_found 返回 false 的概率。

C++ 中的异常是为一个目标而构建的——让不抛出异常的情况尽可能便宜,前提是它们是在异常情况下抛出的。

因此,如果 Key_found 的概率真的很低,则返回复合类型而不是简单类型的额外开销将使第二种形式更便宜(假设,即 MyObject 确实很简单。否则,应该没什么区别)。

另一方面,如果 Key_found 的概率不是那么低,则重复展开堆栈的成本会高得多。

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

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

另外, throw 样本也有很多问题。特别是,什么都不抛出并不会像您认为的那样做,catch(...) 而不重新抛出是一个真的坏主意。

关于C++ 可选与抛出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48729141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com