首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我的数组达到一定大小时,Qt不起作用

当我的数组达到一定大小时,Qt不起作用
EN

Stack Overflow用户
提问于 2018-08-27 15:01:00
回答 4查看 320关注 0票数 0

出于测试目的,我在Qt中尝试了不同大小的数组。

代码如下:

代码语言:javascript
运行
复制
#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的内存限制?

EN

回答 4

Stack Overflow用户

发布于 2018-08-27 15:10:41

当你写的时候:

代码语言:javascript
运行
复制
string arr[sizeArray];

您在堆栈上创建了一个大小为sizeArraystd::string类型的数组。不要在堆栈上创建这么大的数组,因为填充它的速度很快;而且,你不能在程序中做太多事情,因为你把所有的局部变量都放在堆栈上。请改用动态数组,如std::vectorQVector

下面是std::vector的一个示例

代码语言:javascript
运行
复制
std::vector<std::string> arr(sizeArray);

另外,不要使用C风格的数组。如果你想要一个大小已知的堆栈数组,并且它不会很大(即它不应该耗尽堆栈),那么可以使用std::array,如下所示:

代码语言:javascript
运行
复制
const int size_of_the_array = 10;
std::array<std::string, size_of_the_array> arr; 
票数 6
EN

Stack Overflow用户

发布于 2018-08-27 17:23:18

您可能只是在string arrsizeArray;处遇到堆栈溢出

数组太大,无法放入程序的堆栈地址空间。

如果您在堆上分配数组,那么假设您的机器有足够的内存,那么应该没有问题。

代码语言:javascript
运行
复制
string *arr = new string[sizeArray];

但请记住,一旦使用完arr,将要求您对阵列执行delete[]操作,如下所示:

代码语言:javascript
运行
复制
delete[] arr;

正如前面的答案,你也可以使用向量,而不是在Stack上使用大型数组。要获得更好的清晰度,可以查看here

票数 0
EN

Stack Overflow用户

发布于 2018-08-28 00:46:42

但是,除了自动存储数组的数据之外,任何其他方法都可以很好地工作--而这正是您应该使用的:

代码语言:javascript
运行
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52034093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档