这两者有什么区别?
for (int i = 0; i < numSamples; i++) {
mData[sampleIndex++] = *buffer++ * (1.0f / 32768);
}
和
memcpy(&mData[sampleIndex], buffer, (numSamples * sizeof(float)));
如果我理解正确,第一个将numSamples
float
值mData
一个一个地复制到。第二个,将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;
这两者有什么区别?
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] 删除。
我来说两句