gpt4 book ai didi

c++ - 使用 operator new 进行内存分配并使用数据进行初始化

转载 作者:行者123 更新时间:2023-11-28 02:39:12 25 4
gpt4 key购买 nike

在我的项目中,有 100 万个输入,我应该比较具有不同输入数量的搜索/排序算法,直到 100 万个输入。我想用数据一起进行内存分配和初始化,但我意识到这是不可能的。所以我决定这样做;

<code>double temp1, temp2, temp3;  //Each line has three numbers
int i;
Person *list[N]; //Here, stackoverflow occurs, for example N=500000
for(i=0; i<N; i++){
file >> temp1 >> temp2 >> temp3;
list[i] = new Person(temp1, temp2, temp3); //I wanted to initialize with data
} //but if I wrote "new Person[N]"
//stackoverflow doesn't occur</code>
但是有一个巨大的数字溢出,例如 N = 500000。那么,有没有什么方法可以将这两者结合起来呢?(没有溢出,有数据初始化)

其次,这两个代码之间有什么区别吗?
<code>Person *list[N];
for(i=0; i<N; i++){
list[i] = new Person();
}</code>

<code>Person *list = new list[N];</code>

最佳答案

作为初学者,最好避免使用自己的容器。您可以只使用标准提供的:

...

#include <vector>
#include <cstdlib> // for EXIT_FAILURE, EXIT_SUCCESS

double temp1, temp2, temp3; //Each line has three numbers
std::vector<Person> people;
for(int i=0; i<N; i++)
if (file >> temp1 >> temp2 >> temp3)
people.emplace_back(temp1, temp2, temp3);
else
{
std::cerr << "error reading 3 numbers from file, terminating\n";
exit(EXIT_FAILURE);
}

使用 vector(或 new Person[n],与 new Person*[n] 对比)特别有用将数据放在一起(连续)在内存中,这样您的 CPU 在您要比较的搜索和排序期间从其缓存中获得最大可能的好处......如果您的数据更难访问,它将隐藏两者之间的性能差异程度被测算法。 new Person*[n] 和每个 Person 对象都被分配到堆上,数据变得分散并且访问速度会慢得多。


只是为了解释您当前的代码发生了什么:

  • 您试图将太多数据放入堆栈;您可以通过使用一个指向所需动态分配内存量的堆栈托管指针来解决这个问题(应用程序拥有比堆栈空间多得多的可用动态内存是正常的)。

Secondly, is there any difference between these two code;

Person* list[N];                  // first
for(i=0; i<N; i++){
list[i] = new Person();
}

Person *list = new Person[N]; // second - corrected from "new list[N}"

首先在堆栈上请求一个 Person* 的数组,然后将这些指针中的每一个分配给一个不同的动态分配的内存地址。充其量,这将使用 几乎 与尝试将 Person list[N]; 直接放在堆栈上一样多的堆栈内存 - 最坏的情况下大约是两倍以同样的方式失败。它还将 Person 数据分散在动态内存中,对数据的操作将不必要地缓慢。

第二个创建一个动态分配的内存区域,其大小足以容纳 N Person,并在堆栈上保留一个指向它的指针。这并非不合理(但 std::vector 仍然是一个更好的主意)。

关于c++ - 使用 operator new 进行内存分配并使用数据进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26547533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com