【问题标题】:How much data can you put on the stack?您可以在堆栈中放入多少数据?
【发布时间】:2013-07-25 13:15:05
【问题描述】:

我尝试在堆栈上创建一个 ~975KB 数组,但它崩溃了。

const int size = 500;
cout << (sizeof(float)*size*size)/1024 << endl;
float myArray[size*size]; // crash

这似乎是一个非常小的空间。在我初始化变量之前,有什么方法可以知道有多少可用空间(总空间和当前空间)?

【问题讨论】:

  • 哪个编译器和操作系统,会有所不同,visual studio我认为是1兆。
  • Visual C++ 11 (x86) 和 Windows 7
  • 我确信可以调整堆栈。话虽如此,为什么不使用std::vector&lt;float&gt; 并避免堆栈有限的问题?
  • 在 Palm V 上大约是 12kB 左右。

标签: c++ visual-c++


【解决方案1】:

堆栈在几乎所有系统中都是有限的。允许多大取决于操作系统/编译器组合。将非常大量的数据放在堆栈上是一个糟糕的主意。要么使用 C++ 标准类型(例如vector),要么使用您自己的动态内存分配。您永远不知道其他函数何时会增加一些额外的堆栈,并且突然之间,您会超出限制-最好不要接近堆栈的最大大小。

【讨论】:

    【解决方案2】:

    在 Visual C++ 中,默认堆栈大小由链接器选项 /STACK (doc) 管理。默认为 1 MB。

    请注意,每个新线程都有自己的堆栈,您可以在函数 CreateThread 中使用参数 dwStackSize 指定初始大小。如果为 0,则默认为链接器命令中使用的那个。

    关于您的其他问题,无法查询当前/最大堆栈大小。为避免出现问题,最好将堆用于任何重要的内存分配。

    【讨论】:

      【解决方案3】:

      Visual Studio 的默认堆栈大小为 1MB,正如 Andre 所说,您可以使用 std::vector 来避免此问题,或者您可以动态分配内存。您可以使用 /F 在 Visual Studio 上调整堆栈大小。如果没有令人信服的理由在堆栈上分配数据,则使用其他选项可能更有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        相关资源
        最近更新 更多