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交换也较慢.