C memcpy反过来

Ara*_*and 12 c reverse memcpy

我正在处理音频数据.我想反向播放示例文件.数据存储为无符号整数并且包装良好且紧凑.有没有办法调用memcpy将以相反的顺序复制.即如果我有1,2,3,4存储在一个数组中,我可以调用memcpy神奇地反转它们,所以我得到4,3,2,1.

Alo*_*hal 9

这适用int于反向复制s:

void reverse_intcpy(int *restrict dst, const int *restrict src, size_t n)
{
    size_t i;

    for (i=0; i < n; ++i)
        dst[n-1-i] = src[i];

}
Run Code Online (Sandbox Code Playgroud)

就像memcpy(),区域指向dst并且src不得重叠.

如果要反向就位:

void reverse_ints(int *data, size_t n)
{
    size_t i;

    for (i=0; i < n/2; ++i) {
        int tmp = data[i];
        data[i] = data[n - 1 - i];
        data[n - 1 - i] = tmp;
    }
}
Run Code Online (Sandbox Code Playgroud)

上述两个功能都是可移植的.您可以通过使用特定于硬件的代码来加快它们的速度.

(我没有测试代码的正确性.)

  • 与memcpy相比,这有什么效果? (4认同)
  • 通过我的快速测试,使用`-O3`优化,`reverse_memcpy()`比`memcpy()`慢大约3倍,用于复制1000000字节.对于1000000字节的10000次迭代,`memcpy()`需要4秒,而`reverse_memcpy()`需要11次.但是这些数字是针对一个非常特殊的情况,所以你可能想要自己测试一下.当然,正如dreamlax所说,两者都是O(n). (4认同)
  • `memcpy`应该是O(n),因此`reverse_memcpy`函数应该是. (3认同)

jan*_*anm 8

不,memcpy不会倒退.如果您在C中工作,请编写一个函数来执行此操作.如果您真的在C++中工作,请使用std :: reverse或std :: reverse_copy.

  • 我知道这是旧的,但你能发布一个这样做的功能的例子吗?这很简单,但它可能对某人有所帮助. (3认同)