代码之家  ›  专栏  ›  技术社区  ›  gauteh tpg2114

为什么我只能使用C++中的可变长度数组分配小于10 MB的数据?[副本]

  •  -2
  • gauteh tpg2114  · 技术社区  · 6 年前

    我知道可变长度数组(vla)是 technically not allowed in C++ . 但是,除非您使用 -pedantic

    虽然我还没有找到具体的参考资料,但我很肯定 VLAs 在堆栈上分配动态数组,而在堆上分配动态数组。

    在调试一个通常接收小于100MB消息的函数时,我遇到了一个 中间的

    为什么这段代码的字节数这么少?VLA的大小有限制吗?为什么故障发生在访问上,而不是分配上?为什么我可以使用gdb访问数组的末尾(在这个示例代码中,在另一个更大的程序中,我也可以访问start)?

    # include <iostream>
    # include <vector>
    
    using std::cout;
    using std::endl;
    
    
    void foo_a (int n) {
      /* on stack */
      cout << "a: (C),   n = " << n << endl;
      char buffer[n]; buffer[n] = '\0';
    
      cout << (void*)buffer << endl;
    
      for (int i = 0; i < n; i++) {
        buffer[i] = (char) i;
      }
    }
    
    void foo_b (int n) {
      /* on heap */
      cout << "b: (C++), n = " << n << endl;
      char * buffer = new char[n];
    
      for (int i = 0; i < n; i++) {
        buffer[i] = (char) i;
      }
    
      cout << (void*)buffer << endl;
      delete [] buffer;
    }
    
    int main (int, char**) {
      int Ns[] = { 1024, 123123, 10586239 };
    
      for (int n : Ns) {
        foo_b (n);
        foo_a (n);
      }
    
      return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Alan Birtles    6 年前

    堆叠的大小通常是固定的。因为这个大小是在线程创建时保留的,如果这个大小很大,那么在内存耗尽之前,您将无法创建很多线程。

    通常情况下,Linux上的堆栈大小约为8mb,Windows上的堆栈大小约为1mb。

    您可能可以分配超过可用堆栈大小的资源,而您的程序只有在尝试访问超出可用堆栈大小的资源时才会崩溃。这取决于平台,例如,在Windows上,一旦分配了超过堆栈容量的内存,就会出现堆栈溢出异常。