【发布时间】:2011-06-20 23:55:59
【问题描述】:
如果堆栈为空且没有可弹出的内容,为什么 std::stack::pop() 不抛出异常?
(我正在为我自己的代码设计一个专门的堆栈,并且想知道这种方法(需要手动检查堆栈是否为空)与抛出异常之间的权衡。
我的猜测是,尽管 C++ 支持异常处理,但它的运行时开销很小,因此,为了获得最佳性能,决定不在 std::stack::pop 中抛出异常)。
【问题讨论】:
-
您几乎猜对了。问题不在于异常的开销。它每次都在测试堆栈是否为空。如果您使用 std::stack,您应该知道(或检查自己)何时它变为空。
-
我不确定我是否理解在每次弹出之前检查堆栈是否为空会是低效的。这将是一个非常小的常数时间比较,不是吗?
-
@Nocturne:它会很小,但它仍然是一些东西。什么>什么都没有。也就是说,std::stack 是一个容器适配器,因此在这种情况下,它只是执行底层容器所做的任何事情。
-
@Fred:实际上想一想,大多数算法可能无论如何都会检查空堆栈。所以提供一个 IsEmpty() 方法并让 pop 抛出一个异常对我来说更有意义(捕捉错误等等),而性能问题有点无关紧要。
-
@Moron:并非所有算法都需要检查。根据发生的情况,算法的其余部分可能会保证您永远不会弹出空堆栈。