适配 std::swap 接口交换 n 个字节

Adapting std::swap interface to swap n bytes

我有一个 C 函数来交换任意数量的字节:

void my_swap(void* a, void* b, long n);

我对几种类型做了一点基准测试,我发现 std::swap 优于 my_swap

所以,我想用 my_swap 接口包装 std::swap,但我不知道如何告诉 std::swap 表现得好像它在交换两个变量T 类型的 sizeof(T)==n.

任何人都可以将 std::swap 包装在与 my_swap 具有相同签名(当然还有相同语义)的函数中吗?

不可能,因为 std::swap 必须确切知道传递的变量的类型。

您的 my_swapstd::swap 慢的原因可能有多种,例如:

  • 您的函数逐字节传输,这通常比对整数执行相同操作慢 4*(或更多)
  • 编译器生成较慢的代码,因为它无法确定这两个 void* 变量是否指向 "unaliased" 内存(特别是,您将对指向的内存执行的操作不会到达一个可能与另一个重叠的区域)。编译器不允许为这种情况生成快速代码,因为在重叠的情况下会导致错误的数据操作。

这就是为什么不可能编写出与 std::swap 一样快的 my_swap 的实现,因为这个 void* 作为参数就是原因。