如何将此memcpy转换为for?

加托尼托

这两者有什么区别?


for (int i = 0; i < numSamples; i++) {
    mData[sampleIndex++] = *buffer++ * (1.0f / 32768);
}

memcpy(&mData[sampleIndex], buffer, (numSamples * sizeof(float)));

如果我理解正确,第一个将numSamples floatmData一个一个地复制第二个,将numSamples*sizeof(float)字节复制mData. 由于我们正在复制numSaples* number of bytes on float,我认为它们做同样的事情,但第一个实际上在传递到mData.

那么,有没有办法将 thememcpy转换为 a for就像是:

for (int i = 0; i < numSamples * sizeof(float); i++) {
    //What to put here?
}

语境:

const int32_t   mChannelCount;
const int32_t   mMaxFrames;
int32_t sampleIndex;
float          *mData;
float *buffer;
chux - 恢复莫妮卡

这两者有什么区别?

for (int i = 0; i < numSamples; i++) {
  mData[sampleIndex++] = *buffer++ * (1.0f / 32768);
}
// and
memcpy(&mData[sampleIndex], buffer, (numSamples * sizeof(float)));

鉴于* (1.0f / 32768);. 我假设代码比较将缩放差异放在一边。@托马斯马修斯

  • 重要:循环buffer, sampleIndex后有不同的值for

  • *buffer++如果类型发生buffer变化,则无需更改代码* sizeof(float)obilgies 代码更改。本来可以用的* sizeof *buffer

  • mempcy()是每个平台的优化代码。for()循环只能做这么多。特别是,mempcy()假设mData, buffer不重叠。for()循环可能无法做出最优化。

  • for使用int索引,其中memcpy()用途size_t与巨大的阵列有所不同。

  • memcpy()容忍未对齐的指针。mData[sampleIndex++] = *buffer++ ..才不是。

“第一个将 numSamples 浮点值一个一个地复制到 mData。”是不确定的。智能编译器可能能够根据上下文制作某些并行副本,并且就像一个一个地复制一样

发布使用这两种方法的整个代码/函数块,以便更好地进行比较。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章