如何摆脱 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::write: device not open”