【问题标题】:What is the maximum size of a stack when using the standard C++ library stack class?使用标准 C++ 库堆栈类时,堆栈的最大大小是多少?
【发布时间】:2015-01-02 07:57:21
【问题描述】:

使用标准 C++ 库stack 类时,堆栈的最大大小是多少? 或者你能定义它的最大尺寸吗?我一直在寻找,但没有找到答案。

【问题讨论】:

  • 它将是底层类型的最大大小,最终取决于实现和可用内存。
  • 堆栈是一个容器适配器,其内存空间由底层容器管理
  • @JerryCoffin 这取决于你如何配置 Linux。我总是设置它,以便在空间不足时获得std::bad_alloc 异常。
  • @JamesKanze:很公平。底线是它通常由操作系统来决定(我认为你的回答很好)。

标签: c++ stack


【解决方案1】:

堆栈是一个容器适配器,因此它的限制取决于底层容器的限制。默认情况下这是deque

默认情况下,如果没有为特定堆栈类实例指定容器类,则使用标准容器双端队列。

由于系统或库实现限制,这可以通过max_size 函数找到:

// deque::max_size
#include <iostream>
#include <deque>

int main ()
{
  unsigned int i;
  std::deque<int> mydeque;

  std::cout << mydeque.max_size(); // 1073741823

  return 0;
}

Example

作为示例值,它在链接的程序上返回 1073741823。

您还应该记住:

由于已知的系统或库实现限制,这是容器可以达到的最大潜在大小,但 不能保证容器能够达到该大小:它仍然可能无法在任何时候分配存储达到该大小之前的点。

即这些是理论设计限制,您不应该在正常使用场景中接近这些限制。其他容器也有类似的考虑。

【讨论】:

    【解决方案2】:

    本身没有一个。如果底层容器用完,它将尝试从堆(最终是操作系统)中获取更多内存。如果这失败了,你通常应该得到一个std::bad_alloc 异常,尽管一些系统在这方面被破坏了,需要特殊的配置才能工作。

    【讨论】:

      【解决方案3】:

      您对存储在容器中的对象数量有两个限制:

      1. 容量变量可以容纳的最大值。
      2. 您的程序可用的内存。

      容器容量
      让我们在一个非常小的容器上考虑这个问题,一个使用 uint8_t 变量来计算计数器中元素数量的容器。

      uint8_t 变量可以容纳 256 个变量,因此容器将被限制为 255 个项目,而不管系统可用的内存量如何。

      内存限制
      每个平台的内存量都是有限的。

      在许多平台中,操作系统负责为您的程序分配内存。例如,您的平台可能正在运行一个使用大量内存的应用程序,因此您的程序没有多少剩余空间。

      如果容器使用 64 位无符号整数作为其容量和索引,则容器的容量可能仍会受到分配给程序的内存的限制。如果你的程序分配了 1024 字节的内存,那么你的容器的容量不超过 1024/object_size。因此,如果我的对象是 256 字节,那么我可以在容器中存储的最大数量是 1024/256 或 4 个对象。

      总结
      容器容量受限于其索引或容量变量使用的范围、容器中对象的大小以及分配给程序的内存量。所有容器都会有一些开销,会降低容器的容量(例如,基于链表的容器需要为链接字段增加内存)。有时分配给程序的内存可能是程序加载后剩余的内存量。 通常,容器容量不是问题,除非程序运行在内存受限的系统上,例如大多数没有硬盘的嵌入式平台。

      【讨论】:

        【解决方案4】:

        “使用标准 C++ 库堆栈类时,堆栈的最大大小是多少?”

        恐怕这取决于实现/操作系统。从理论上讲,它应该针对std::stack::size_type 能够容纳的内容。

        【讨论】:

          猜你喜欢
          • 2019-10-20
          • 2012-06-26
          • 2017-01-11
          • 2015-02-13
          • 2010-12-22
          • 1970-01-01
          • 2017-09-30
          • 2014-01-11
          相关资源
          最近更新 更多