QT获取设备内存大小

本文介绍了一个简单的函数getPhysMem(),用于获取系统的物理内存大小。该函数通过MEMORYSTATUSEX结构体来调用GlobalMemoryStatusEx函数,并返回内存大小(以KB为单位)。此代码片段适用于Windows操作系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unsigned int getPhysMem()
{
    static unsigned int size = 0;
#ifdef Q_OS_WIN
    if (size == 0) {
        MEMORYSTATUSEX memoryInfo;
        memoryInfo.dwLength = sizeof(memoryInfo);
        GlobalMemoryStatusEx(&memoryInfo);

        int kb = 1024;
        size = memoryInfo.ullTotalPhys/kb;
    }
#endif
    return size;
}

Qt 中直接获取文档(例如文本文件、图片等)的内存大小并不是一个内置的功能,通常需要借助于操作系统提供的函数或手动计算。对于不同类型的文档,获取内存大小的方式也有所不同。以下是几种常见场景下的解决方案: ### 文本文件和其他二进制文件 对于普通的文本文件或其他二进制文件,可以直接通过读取整个文件到内存然后测量其大小的方式来估算占用的内存量。 #### 示例代码 ```cpp #include <QFile> #include <qdebug.h> quint64 getFileMemorySize(const QString &filePath) { QFile file(filePath); if (!file.exists()) { qDebug() << "文件不存在:" << filePath; return 0; } if (!file.open(QIODevice::ReadOnly)) { qDebug() << "无法打开文件:" << filePath; return 0; } quint64 fileSize = file.size(); // 获取文件大小(字节) QByteArray data = file.readAll(); file.close(); // 注意:此时data变量中存储的是完整的文件内容, // 所以其长度等于文件的实际大小。 // 因此可以用以下方式返回结果: return static_cast<quint64>(data.length()); } // 调用示例 QString pathToTextFile = "/path/to/your/file.txt"; quint64 memorySizeInBytes = getFileMemorySize(pathToTextFile); qDebug() << "文件" << pathToTextFile << "占用了大约" << memorySizeInBytes / 1024.0f / 1024.0f << "MB 的内存空间."; ``` ### 图像文件 图像文件的情况稍微复杂一些,因为它们可能是压缩过的格式如JPEG/PNG/etc., 直接加载后的解码尺寸会比原始文件大得多。你可以使用 `QImage` 或者更高效的第三方库来准确地确定解码后所占用的空间量。 #### 使用 QImage 测量 ```cpp #include <QImage> quint64 getImageMemorySize(const QString &imagePath) { QImage image(imagePath); if (image.isNull()) { qDebug() << "无效的图片路径:" << imagePath; return 0; } // 计算解压后的图像数据所需的最大内存开销(按像素数*每通道深度) int bytesPerPixel = image.depth() / 8; // 每个像素多少个字节 return static_cast<quint64>(bytesPerPixel * image.width() * image.height()); } // 调用示例 QString pathToImageFile = "/path/to/image.jpg"; quint64 imageSizeInBytes = getImageMemorySize(pathToImageFile); qDebug() << "图片" << pathToImageFile << "完全解码后将占用约" << imageSizeInBytes / 1024.0f / 1024.0f << "MB 内存."; ``` ### 其他类型的数据结构 如果是自定义的对象或容器(比如 QList<QWidget*>),则可以根据对象的具体成员变量以及内部使用的缓冲区等情况来进行粗略估计。这类任务往往比较棘手且容易遗漏细节,因此推荐尽量避免频繁监控这些动态变化的内容块,除非确实有必要。 ### 提高效率的小技巧 当只需要大致了解某个大型集合(如 QStringList 或 QVector<T>)的大致容量时,可以简单参考 `.capacity()` 和 `.size()` 方法的结果乘以单个元素平均占用的空间作为近似值。 --- 以上就是在 Qt 应用程序中针对不同类型文档评估其所消耗的内存大小的基本思路和技术手段。根据不同需求选择合适的方法非常重要,同时也应注意保持性能优化意识,在不影响正常业务流程的前提下尽可能高效完成此类工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值