如何声明具有 1000000 个元素的类 C++

how to declare class with 1000000 elements c++

本文关键字:1000000 元素 C++ 何声明 声明      更新时间:2023-10-16

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

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

现在我需要存储近 1000000 个此类的 elment(取决于用户输入的类对象数量可以在 1 <= n <= 1000000 的范围内警告对象动态创建为

#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 a[1000][1000];

但是这种方法对我不起作用

如果有人有任何想法,请帮助我解决这个问题提前致谢

只需使用std::vector

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

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

是在heap上声明它们而不是

stack上声明它们,你在堆栈上声明 1000000 个对象,这太多了。小心,有堆栈限制:

C/C++ 程序的最大堆栈大小

为什么堆栈内存大小如此有限?

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

arr *arr= new arr[n];

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

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

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

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

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