gpt4 book ai didi

c++ - 按位运算比调用memcpy更快吗?

转载 作者:行者123 更新时间:2023-12-03 00:40:57 24 4
gpt4 key购买 nike

我在弄乱音频文件,并学习如何提取样本进行操作,而不要进行其他操作。现在,我专门使用.wav文件,并假设 header 为44字节,样本大小为16位。

因此,我编写了这段代码,它使用两个char值并将其存储到2字节短的字节中,以便可以将其转换为32位浮点型。

        short ss = ((0x0000 | data[i*2+1]) & 0xff) << 8;
short fs = (0x0000 | data[i*2]) & 0xff;
short s = fs | ss;

最初,我使用 memcpy(&s, &data[i*2], 2)来做到这一点。他们都实现了我想做的事情,并且我能够获取这些值并将其流式传输到输出缓冲区,并且它可以正常工作。

我想知道执行按位操作是否值得,而不是简单地调用memcpy性能明智的方法。

最佳答案

根据编译时使用的各种优化等,对于如此小的副本(两个字节),memcpy的速度将显着降低。有几种方法可以使它变得更好。例如,可以使用并集来允许编译器访问存储字的不同部分。

inline float getSamp(char *data, int i)
{
union char_short
{
char d[2];
short s;
} sdata;
float f;

sdata.d[1] = data[i*2+1];
sdata.d[0] = data[i*2];

f = sdata.s / 32768.0f; // using 32768 because this is signed,
// and the maximum negative value is -32768.
// This gets you a range of -1 to +0.9999695
return f;
}

由于数组索引,这种方法仍然不是最佳方法。

使用内联(因此不执行调用)和位操作可以进行进一步的优化。同样,取消引用数组可以节省一些数组地址计算。如果您可以忍受指向正确字节的数据点,甚至可以保存此取消引用。
inline float getSample(char *data, int i);
{
char *d = &data[2 * i];
short sdata = ((*d) & 0x00FF);
d++;
sdata |= ((*d << 8) & 0xFF00);
return sdata / 32768.0f;
}

尽管您可以进行进一步的调整,但这样做并不值得,因为编译器的优化会为您挤出更多的空间。

因此,回答问题-这取决于。您要移动多少内存,并且要进行多少操作?考虑到当今多核处理器的速度,音频太简单了。但是,如果您使用的是速度和内存大小很重要的小型ARM嵌入式系统,那么最后一个例程将有很大的不同。

祝好运

关于c++ - 按位运算比调用memcpy更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34345428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com