【发布时间】:2012-05-19 22:04:58
【问题描述】:
我了解到可以使用异或操作来实现有效的交换功能。像这样:
template<class T>
void swap(T& a, T& b)
{
a = a^b;
b = a^b;
a = a^b;
}
但是我在网上能找到的swap的实现基本上是这样的:
template<class T>
void swap(T& a, T& b)
{
T temp(a);
a = b;
b = temp;
}
编译器似乎没有为上述两种形式生成相同的代码,因为我在 VC++ 2010 上对其进行了测试,第一个比std::swap 更快地完成了这项工作。第一个有便携性或任何其他问题吗?请随时纠正我的任何错误,因为我不是英语母语,也不擅长 C++。
(编者注:很可能测试是使用未优化的调试版本完成的,而不是 std::swap 可以内联的发布版本。基准调试版本毫无意义。编译器通常不会优化 xor-swap 到更多的东西效率。)
【问题讨论】:
-
只是一个假设:至少 x86 CPU 有XCHG 指令,比三个 XOR 更快。
-
您是否在启用优化的情况下运行测试?
-
@Joulukuusi x86 上的 XCHG 指令从来都不是交换替换。如果在内存操作数上使用它有一个隐式锁定前缀,它被用作同步工具。
XCHG reg, reg可能会被使用,尽管我怀疑它是否需要 - 重命名寄存器更快。我已经写了几 k 行汇编,我从未有过使用xchg交换值的冲动。 -
@phresnel 天哪,我发现我从来没有接受过答案,因为我不知道如何接受。
-
@drhirsch,谢谢!事实证明,gcc 在我的机器上将第二个交换函数优化为几个
movs。
标签: c++ swap xor micro-optimization premature-optimization