gpt4 book ai didi

c++ - vector 的预分配 vector ,但在填充时内存仍然线性增加

转载 作者:行者123 更新时间:2023-11-28 00:41:30 27 4
gpt4 key购买 nike

我很困惑为什么系统监视器显示我的内存在线性增加,因为我读入每一行(进入同一个变量),同时将字符串的一部分存储在预分配的内存中。

// pre-allocate
int rows = 100000;
int columns = 300;
QVector<QString> matrix_row;
matrix_row.resize(rows);
QVector< QVector<QString> > matrix;
matrix.resize(num_columns);
qFill(matrix.begin(), matrix.end(), matrix_row);

int current_row = 0;
while(!filestream.atEnd())
{
QString line = filestream.readLine();
for (int i = 0; i < num_columns; i++)
{
matrix[i][current_row] = line.left(end[i]).right(grom[i]);
}
++current_row;
}

速度是个问题,所以我想可能是哪里出了问题。

初始分配后,它从大约 26% 开始,到我 8gb 内存的大约 65% 结束。

有什么问题吗?

最佳答案

您必须意识到您的矩阵的大小为 100 000 x 300,即它包含 30 000 000 个 QString 对象
~> 在构造矩阵之后,这些字符串仍然是空的 ~> 当你填充矩阵时,每个新字符串都会额外分配一个小内存块(由 QString 内部使用)因此,您的应用程序的内存需求不断增长。

由于 QVector 是一个复杂的对象,它占用的空间比其元素所需的空间多一点,所以这个小错误也很重要:您 resize 行具有 行数 的长度并且您可以调整大小 矩阵以使行数等于 列数。应该是相反的方式。

另请注意,即使在应用上述更改之后,此代码:

QVector<QString> matrix_row;
matrix_row.resize(columns);
QVector< QVector<QString> > matrix;
matrix.resize(rows);
qFill(matrix.begin(), matrix.end(), matrix_row);

等同于:

QVector< QVector<QString> > matrix(rows, QVector<QString>(columns) );

关于c++ - vector 的预分配 vector ,但在填充时内存仍然线性增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18663612/

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