适配 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_swap
比 std::swap
慢的原因可能有多种,例如:
- 您的函数逐字节传输,这通常比对整数执行相同操作慢 4*(或更多)
- 编译器生成较慢的代码,因为它无法确定这两个
void*
变量是否指向 "unaliased" 内存(特别是,您将对指向的内存执行的操作不会到达一个可能与另一个重叠的区域)。编译器不允许为这种情况生成快速代码,因为在重叠的情况下会导致错误的数据操作。
这就是为什么不可能编写出与 std::swap
一样快的 my_swap
的实现,因为这个 void*
作为参数就是原因。
我有一个 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_swap
比 std::swap
慢的原因可能有多种,例如:
- 您的函数逐字节传输,这通常比对整数执行相同操作慢 4*(或更多)
- 编译器生成较慢的代码,因为它无法确定这两个
void*
变量是否指向 "unaliased" 内存(特别是,您将对指向的内存执行的操作不会到达一个可能与另一个重叠的区域)。编译器不允许为这种情况生成快速代码,因为在重叠的情况下会导致错误的数据操作。
这就是为什么不可能编写出与 std::swap
一样快的 my_swap
的实现,因为这个 void*
作为参数就是原因。