如何摆脱 QIoDevice 中的 memcpy

Posted

技术标签:

【中文标题】如何摆脱 QIoDevice 中的 memcpy【英文标题】:How to get rid of memcpy in QIoDevice 【发布时间】:2014-06-26 20:56:36 【问题描述】:

我正在使用 Qt 进行一些音频输出。有一个示例音频输出,其中纯虚函数 qint64 QIODevice::readData ( char * data, qint64 maxSize ) 像这样重新实现(这不是示例中的实际代码)。

qint64 Generator::readData(char *data, qint64 len)

    memcpy(data, m_buffer.data(), len);
    return len;

所以,我们获得指向数据的指针,将内存从缓冲区复制到该数据。我想知道是否可以将指针数据分配给新位置,如下所示:

qint64 Generator::readData(char *data, qint64 len)

    data = m_buffer.data();
    return len;

因为,memcpy 很慢,而且 C。我可以吗?谢谢!

好的,只是不要接收 cmets “什么是慢的”: 首先 - memcpy 比指针赋值慢 第二 - 是的,我在播放声音时有延迟,我想让程序在每一点都处于最佳状态。

附:我正在尝试这样做,但我没有声音,所以也许答案是否定的。那为什么呢?

【问题讨论】:

如果使用 C 标准库得罪了你,总有std::copy_n “memcpy 很慢” 您是否真的分析过您的代码以确定它“很慢”? Memcpy 比指针赋值慢。现在程序中存在一些延迟,我正在努力使其在每一点上都超快。 【参考方案1】:

此方法的签名仅允许您通过复制数据来返回数据。 分配指针是没有意义的,因为这个参数是作为副本传递的,所以分配的值在你的方法之外是不可见的。

memcpy 对于实时音频输出一点也不慢(除非你在 8 位处理器上这样做)。

太慢的音频代码会导致声音中断,但不会导致延迟。延迟是音频缓冲区过大的结果。

【讨论】:

以上是关于如何摆脱 QIoDevice 中的 memcpy的主要内容,如果未能解决你的问题,请参考以下文章

实现 QIODevice::writeData,文档混乱

Qt - 如何计算 .txt 文件中的行数

文件打开时出现“QIODevice::write: device not open”

Qt 写入 xml:QIODevice::write (QFile, "D:/logs.xml"): 设备未打开

如何摆脱 MySQL 中的 STRICT SQL 模式

如何摆脱 PHP 中的 filesize() 警告?