【发布时间】:2010-09-07 09:43:48
【问题描述】:
我想交换两个整数,我想知道这两种实现中哪一种会更快: 使用临时变量的明显方法:
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
或者我相信大多数人都见过的异或版本:
void swap(int* a, int* b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
似乎第一个使用了额外的寄存器,但第二个执行了三个加载和存储,而第一个只执行了两个。谁能告诉我哪个更快,为什么?为什么更重要。
【问题讨论】:
-
XOR 比较慢。使用godbolt 检查这两个函数的汇编指令计数。 注意如果你对值使用 XOR 方法而不是存储在指针下的值,速度是一样的(至少对于 GCC 编译器)
-
似乎第一个使用了一个额外的寄存器这里有点晚了,但为什么会有人这么认为呢?比特旋转比使用临时变量更快的信念忽略了大多数计算机如何工作的现实,具有单独的 CPU 和内存。使用临时变量的交换可能实现为“将 A 加载到寄存器 1,将 B 加载到寄存器 2,将寄存器 1 保存到 B,将寄存器 2 保存到 A”。 “将两个变量加载到寄存器中,旋转一点,然后进行两次保存操作”速度较慢。 您必须同时加载并保存两者,一路上的小玩意是无关紧要的。
标签: c performance