【问题标题】:What is the QBytearray, returned by QFile readAll()QFile readAll() 返回的 QBytearray 是什么
【发布时间】:2013-09-05 03:43:34
【问题描述】:

我想问如果 QFile().readAll() 返回一个 QByte Array 那么它是在物理内存上创建一个字节数组还是只提供一个包含字节位置的链表地址?。

对于以 GB 为单位的大文件是否会产生问题。

【问题讨论】:

    标签: qt qt4.7


    【解决方案1】:

    是的,它确实在 RAM 中创建了一个字节数组,复制了硬盘中的整个内存。所以你会遇到在大文件上运行QFile::readAll() 的问题。

    QString QTextStream::readAll() 的文档说:

    读取流的全部内容,并将其作为 QString 返回。 在处理大文件时避免使用此功能,因为它会消耗 大量的内存。

    QByteArray QIODevice::readAll() 没有提到它(由QFile 继承),但它会是一样的,因为QByteArray 中的指针不可能指向硬盘中的某个位置(必须是地址在操作系统分配给程序的虚拟内存中,即堆栈或堆)。

    【讨论】:

    • 但是如果 read() 采用 qint64 并返回一个 byteArray ,那么如果它采用 qint64 长度指针,那么生成的 QByte 数组的长度必须为 qint64 ...这意味着必须有一种方法从硬盘而不是从 RAM 表示这个字节数组....?
    • @Anupam,不,您无法从硬盘中表示字节数组,因为 C++ 指针必须位于分配给您的应用程序的虚拟内存中。因此, read() 确实将内存从您的设备(例如硬盘)复制到您的 RAM。使用 64 位 int 是因为 32 位 int 可能不足以满足您的需求。最大的 32 位 int 大约是 40 亿,也许您想将 5GB 从您的设备传输到您的 RAM。使用 32 位整数是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多