出于测试目的,我在Qt中尝试了不同大小的数组。
代码如下:
#include <QCoreApplication>
#include <iostream>
using namespace std;
int const sizeArray = 519199;
int main()
{
string arr[sizeArray];
for(int i = 0; i < sizeArray; i++)
{
arr[i] = i;
}
arr[499999] = "Test";
cout << arr[499999] << endl;
}当sizeArray为519999时,程序会快速运行并显示“测试”。但是当sizeArray为519200或更大时,程序运行的时间更长(大约5s),然后在不显示“测试”的情况下结束。
这是操作系统还是Qt的内存限制?
发布于 2018-08-27 15:10:41
当你写的时候:
string arr[sizeArray];您在堆栈上创建了一个大小为sizeArray的std::string类型的数组。不要在堆栈上创建这么大的数组,因为填充它的速度很快;而且,你不能在程序中做太多事情,因为你把所有的局部变量都放在堆栈上。请改用动态数组,如std::vector或QVector。
下面是std::vector的一个示例
std::vector<std::string> arr(sizeArray);另外,不要使用C风格的数组。如果你想要一个大小已知的堆栈数组,并且它不会很大(即它不应该耗尽堆栈),那么可以使用std::array,如下所示:
const int size_of_the_array = 10;
std::array<std::string, size_of_the_array> arr; 发布于 2018-08-27 17:23:18
您可能只是在string arrsizeArray;处遇到堆栈溢出
数组太大,无法放入程序的堆栈地址空间。
如果您在堆上分配数组,那么假设您的机器有足够的内存,那么应该没有问题。
string *arr = new string[sizeArray];但请记住,一旦使用完arr,将要求您对阵列执行delete[]操作,如下所示:
delete[] arr;正如前面的答案,你也可以使用向量,而不是在Stack上使用大型数组。要获得更好的清晰度,可以查看here
发布于 2018-08-28 00:46:42
但是,除了自动存储数组的数据之外,任何其他方法都可以很好地工作--而这正是您应该使用的:
#include <QtCore>
#include <algorithm>
#include <array>
#include <memory>
static constexpr int N = 1000000;
static constexpr size_t pageSize = 4096;
template <typename R> void fill(R &range) {
std::generate(range.begin(), range.end(), [i = 0]() mutable {
return QString::number(i++);
});
qDebug() << *std::prev(std::cend(range));
}
int main() {
static QVector<QString> array1(N);
QVector<QString> array2(N);
QVarLengthArray<QString> array3(N);
auto array4 = std::make_unique<std::array<QString, N>>();//(new std::array<QString, N>);
static_assert(sizeof(array1) < pageSize);
static_assert(sizeof(array2) < pageSize);
static_assert(sizeof(array3) < pageSize);
static_assert(sizeof(array4) < pageSize);
fill(array1);
fill(array2);
fill(array3);
fill(*array4);
}https://stackoverflow.com/questions/52034093
复制相似问题