2015-02-10 73 views
-2

我有一个C函数转换字节任意数量:适应的std ::交换接口交换n个字节

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

我已经做了一些benckmark几种类型,我已经看到了std::swap跑赢my_swap

所以,我想换std::swapmy_swap接口,但我无法弄清楚如何告诉std::swap表现得好像它是将一种类型T的两个变量,为此sizeof(T)==n

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

+0

当你有'std :: swap'这是类型安全的,为什么使用'my_swap'丢掉类型信息? – 2015-02-10 09:32:40

+0

@NickyC因为我有很多旧代码,我无法打破。 – 2015-02-10 09:36:33

+0

如果你在编译时不知道'n'的值,那么你不能这样做。但是,如果您重新解释将'a'和'b'强制转换为'char *',则可以使用'std :: swap_ranges'。 – 2015-02-10 09:43:52

回答

4

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

可能有几个原因,为什么你的my_swapstd::swap慢,如:

  • 你的功能转移逐字节,这通常会导致为4 *(或更多)不是做慢在整数上完成相同的操作
  • 编译器生成较慢的代码,因为它不能确定这两个void*变量指向“非混淆”内存(特别是,您要对指向内存执行的操作不会到达可能与另一个重叠的区域)。编译器不允许为这种情况生成快速代码,因为在重叠的情况下会导致错误的数据操作。

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