使用 std::stack 而不是底层的 std::deque 是否有任何性能损失?

Is there any performance penalty for using std::stack rather than the underlying std::deque?

我想实现一个后进先出堆栈对象。 C++ 标准库提供了一个方便的堆栈结构 (std::stack) 和一个非常简单的接口。默认情况下,它使用 std::deque 作为其底层容器。

使用 std::stack 而不是直接使用 std::deque 是否会导致性能下降?

我的用例将涉及每秒 许多 弹出和推送。

不,使用 std::stack 不会改变性能配置文件(与直接使用 std::deque 相比)。

正如评论者所指出的,你应该总是benchmark first in such cases. As an example I used a tool called Quick Bench,因为它是在线的并且可以嵌入到这里。您应该始终选择最适合特定需求的工具。

在这种情况下,答案取决于您是否启用了优化。请注意,您应该始终对优化的构建进行基准测试,但我包含了未优化的版本以显示结果的差异。如果我们 运行 基准测试 (link) 关闭优化(-O0 on g++),我们会看到 stack 稍微慢一点:

然而,当我们 运行 具有优化(-O3 on g++)的基准(link)时,情况就不同了:

性能几乎相同。这是由于 inlining。这意味着在发布版本中,您不会因使用 stack 而遭受任何性能损失。在 C++ 中,这称为 零成本抽象

值得指出的是,在现实中,即使是“零成本”抽象仍然会产生成本 - increased compile times