【问题标题】:how to declare class with 1000000 elements c++如何声明具有 1000000 个元素的类 c++
【发布时间】:2013-10-12 10:31:06
【问题描述】:

我正在编写一个 c++ 代码,我需要声明一个具有两个元素的类

class arr{
    public:
        long num;
        string str;
};

现在我需要存储这个类的近 1000000 个元素(取决于用户输入的类对象的数量可能在 1

#include <iostream>
#include<string>

using namespace std;

class arr{
    public:
        long i;
        string str;
};

int main(){
    long n,j,i;
    cin>>n;
    arr a[n];

....程序的其余部分

但是如果 n 的值大于 100000 则程序挂起但对于小于 100000 的值可以正常工作 我应该尝试什么方法一次声明超过 100000 个对象我尝试借助正在划分 arra 的 2D 数组来解决问题分两部分

arr [1000][1000];

但这种方法对我不起作用

如果有人有任何想法,请帮我解决这个问题 在此先感谢

【问题讨论】:

  • 使用std::vector 而不是数组。问题解决了。
  • std::vector 有什么问题?
  • 为什么有这么多元素?
  • 您正在堆栈上创建这些数组。动态进行
  • a[1000][1000] 在内存方面真的等同于a[1000000];这只是a[1000000] 的语法糖。

标签: c++ arrays class object declaration


【解决方案1】:

这里有一些背景信息,说明为什么在堆栈上分配太大的对象会因分段错误而失败,而相同数量的空间可能会以许多小块在堆栈上分配:

机制是,系统使用分配的少量内存来设置堆栈。此分配由不可访问的内存区域保护。每当程序访问这个不可访问的区域时,硬件都会向内核发出警报;内核分析情况,推断程序需要更多的堆栈内存,将堆栈增长几个内存页,并告诉硬件正常继续执行程序。

只要访问的地址离栈顶足够近,这样就可以完美地工作,这样内核就可以安全地假设应用程序确实想要绘制一个新的栈帧,而不是访问一些随机内存位置,因为一个错误。在您的情况下,限制似乎在 16 MiB 左右。

你应该能够使用超过 16 MiB 的内存,如果你的堆栈帧都没有大于 16 MiB,因为那样限制会在很多小步骤中提高,系统不会认为你刚刚访问了一个随机位置。

【讨论】:

    【解决方案2】:

    what approach should i try to declare more than 100000 objects?

    是在heap 而不是stack 上声明它们,你在堆栈上声明了 1000000 个对象,这太过分了。小心,有堆栈限制:

    C/C++ maximum stack size of program

    why is stack memory size so limited?

    要在堆上声明它们,请使用:

    arr *arr= new arr[n];

    这与vector 用于初始化元素的机制相同。

    【讨论】:

      【解决方案3】:

      只需使用std::vector

      #include <iostream>
      #include <vector>
      
      int main(){
          long n;
          cin>>n;
          std::vector<arr> a(n);
      }
      

      【讨论】:

      • 非常感谢它解决了我的问题非常感谢:)。 feals 就像我只是在使用旧概念。!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 2019-07-12
      • 1970-01-01
      • 2013-12-16
      相关资源
      最近更新 更多