出于测试目的,我正在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或更高时,该程序将花费更长的运行时间(约5秒钟),然后完成而不显示“测试”。
这是操作系统还是Qt的内存限制?
答案 0 :(得分:6)
写时:
string arr[sizeArray];
您正在堆栈上创建大小为std::string
的{{1}}类型的数组。不要在堆栈上创建如此大的数组,因为您将很快填充它;并且,您将无法在程序中做很多事情,因为您将所有局部变量都保留在堆栈中。使用动态数组,例如std::vector
或QVector
。
以下是sizeArray
的示例:
std::vector
此外,不要使用C样式的数组。如果您想要一个知道其大小且不会很大的堆栈数组(即它不应该耗尽堆栈),请改用std::array
,例如所以:
std::vector<std::string> arr(sizeArray);
答案 1 :(得分:0)
您可能只是在 string arr [sizeArray];
处出现堆栈溢出该数组太大,无法容纳在程序的堆栈地址空间中。
如果您在堆上分配数组,那么假设您的计算机具有足够的内存,那应该没问题。
string *arr = new string[sizeArray];
但是请记住,一旦使用完 arr ,将需要您删除[]数组,如下所示:
delete[] arr;
作为先前的答案,您也可以使用向量,而不是在Stack上使用大数组。为了获得更好的清晰度,您可以检查here
答案 2 :(得分:0)
除了自动存储数组数据之外,其他任何方法都可以正常工作-这就是您应该使用的:
#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);
}
答案 3 :(得分:-3)
您的意思是,大小为519199而不是519999可以吗?
无论如何要检查是否有堆栈限制,请尝试使用new。
字符串* arr =新字符串[sizeArray]