为什么交换不在C++中使用Xor操作

11 c++ swap xor premature-optimization micro-optimization

我已经了解到Xor操作可用于实现有效的交换功能.像这样:

template<class T>
void swap(T& a, T& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}
Run Code Online (Sandbox Code Playgroud)

但是我可以在互联网上找到的交换实现基本上是这样的:

template<class T>
void swap(T& a, T& b)
{
    T temp(a);
    a = b;
    b = temp;
}
Run Code Online (Sandbox Code Playgroud)

似乎编译器没有为上面的两个表单生成相同的代码,因为我在VC++ 2010上测试了它,第一个更快地完成了工作(并且比std :: swap更快).第一个是便携式还是其他任何问题?随意纠正我的任何错误,因为我不是英语本地人,不擅长C++.

Ste*_*sop 19

我已经了解到Xor操作可用于实现有效的交换功能

你知道错了,我很害怕.XOR交换过时了:如果它比使用临时值可靠得快,那么它不应该出现在现代编译器和处理器上(其中"现代"我的意思大致是过去20年或更长时间).你说它对你来说更快,可能你应该展示你的基准代码,看看其他人是否得到了相同的结果.

除了你的代码只适用于整数类型的事实,它有一个基本的错误.尝试使用您的swap版本:

int a = 1;
swap(a,a);
std::cout << a << '\n';
Run Code Online (Sandbox Code Playgroud)


Blu*_*rer 11

效果取决于你使用它的位置.

在普通的cpu上,两个整数变量的正常交换看起来像

$1 <- a
$2 <- b
a <- $2
b <- $1
Run Code Online (Sandbox Code Playgroud)

4个操作,2个负载,2个存储和最长的依赖性是2

在xor方式:

$1 <- a
$2 <- b
$3 <- $1 ^ $2
$4 <- $3 ^ $2
$5 <- $3 ^ $4
a <- $5
b <- $4
Run Code Online (Sandbox Code Playgroud)

7个操作,2个负载,2个存储,3个逻辑和最长的依赖性是4

因此,即使适用,至少通常与xor交换也较慢.

  • 使用现代的SSA编译器,第一个甚至更简单:`Rename(a1,b2),Rename(b1,a2)`-不是单个CPU指令,而是用于编译器的记账内容。哪个变量进入哪个寄存器? (2认同)