【问题标题】:C memcpy in reverseC memcpy 反向
【发布时间】:2011-01-15 14:19:08
【问题描述】:

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

【问题讨论】:

  • C 没有这样的函数,但是很容易写出来。
  • 可能值得考虑改变你迭代数据的方式而不是改变顺序,我怀疑它会更有效......
  • 你让我神奇地难住了。
  • 马克,我不迭代,我以块的形式复制缓冲区。克雷格——电脑很神奇吧? :)
  • 计算机可能很酷,我猜这对于某些用途来说是magic的粗略近似。 :-)

标签: c reverse memcpy


【解决方案1】:

这适用于反向复制ints:

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];

}

就像memcpy()一样,dstsrc指向的区域不能重叠。

如果你想就地反转:

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;
    }
}

以上两个功能都是可移植的。您可以通过使用特定于硬件的代码使它们更快。

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

【讨论】:

  • 这个和memcpy相比效率如何?
  • memcpy 应该是 O(n),这个 reverse_memcpy 函数也应该是。
  • 通过我的快速测试,通过-O3 优化,reverse_memcpy() 复制 1000000 字节的速度比memcpy() 慢 3 倍左右。对于 1000000 字节的 10000 次迭代,memcpy() 用了 4 秒,reverse_memcpy() 用了 11 秒。但这些数字是针对非常特殊的情况,所以您可能想自己测试一下。当然,正如dreamlax所说,两者都是O(n)。
  • @mP:我意识到 OP 可能想要就地反转。当你发表评论时,我正在编辑我的帖子。完全同意你的观点。我的答案的“第一版”警告说需要非重叠区域以及在 C99 中使用 restrict 关键字...
  • 第一个版本将从restricting 参数中受益匪浅。
【解决方案2】:

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

【讨论】:

  • 我知道这是旧的,但你能发布一个这样做的函数的例子吗?这很简单,但它可能会对某人有所帮助。
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 2023-03-15
  • 2023-03-26
  • 2010-10-05
  • 2013-04-16
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多