欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > QVector squeeze()

QVector squeeze()

2025/4/20 19:20:02 来源:https://blog.csdn.net/weixin_44270564/article/details/140301802  浏览:    关键词:QVector squeeze()

 

目录

 1 问题

 2 分析

 3 结果


 1 问题

项目中有成百上千条目,每个条目有使用QVector容器

比如:

使用QVector<short> mDataBuf 容器,使用append()函数或者resize()函数所占的内存过大,大概有两个G左右,每个条目运行完后mDataBuf.clear()后所占内存无变化

QVector<short> mDataBuf;
mDataBuf.resize(num);
mDataBuf.clear();
 2 分析

在Qt中,QVector 是一个动态数组,它负责管理其内部存储的元素的内存。当你调用 resize(num) 时,QVector 会调整其内部存储空间(如果需要的话)以包含至少num个元素的空间。这些元素默认使用它们类型的默认构造函数进行初始化(对于 short 类型,这通常是0)。

然而,当你调用 clear() 方法时,QVector 会将其内部“大小”(即,你可以通过 size() 方法获取的元素数量)设置为0,但它不会立即释放整个底层内存分配。这是因为动态内存分配和释放是开销较大的操作,而且Qt的设计哲学之一是通过减少不必要的内存分配和释放来提高性能。

因此,当你调用 DataBuf.clear() 后,DataBuf 的内存占用量从逻辑上讲是减少了(因为它不再包含任何有效的 short 值),但从物理内存的角度来看,它可能仍然保持着为num个 short 值分配的内存空间。这种空间被称为“容量”(capacity),你可以通过 capacity() 方法来查询它。

如果你想要 QVector 释放其不再需要的内存,你可以使用 squeeze() 方法。这个方法会尝试将 QVector 的容量调整为与其当前大小(即元素数量)相匹配,从而可能释放一些不再需要的内存。但请注意,即使你调用了 squeeze(),Qt 的内存管理器也可能决定保留一些额外的空间以供将来扩展使用,而不是立即将所有多余内存都归还给操作系统。

QVector<short> mDataBuf;
mDataBuf.resize(num);
mDataBuf.clear();
mDataBuf.squeeze();
3 结果

运行完所有条目,程序所占的内存由原来的2个G优化到300M左右

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词