我想交换两个整数,我想知道这两个实现中哪一个更快:

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

或者我相信大多数人都看过的XOR版本:

void swap(int* a, int* b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

第一个似乎使用了一个额外的寄存器,但第二个正在进行三次加载和存储,而第一个只进行两次加载和存储.谁能告诉我哪个更快,为什么?为什么更重要.

推荐答案

如果a和b指向同一地址,XOR方法将失败.第一个异或将清除两个变量指向的内存地址处的所有位,因此一旦函数返回(*a==*b==0),不管初始值是多少.

有关Wiki页面的更多信息:

虽然这个问题不太可能出现,但我总是更喜欢使用保证有效的方法,而不是在意想不到的时候失败的聪明方法.

C++相关问答推荐

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

ISO_C_BINDING,从Fortran调用C

intellisense不工作,甚至已经下载了c/c++扩展

C指针算法在函数参数中的应用

在传统操作系统上可以在虚拟0x0写入吗?

自定义变参数函数的C预处置宏和警告 suppress ?

为什么该函数不将参数值保存到数据 struct 中?

在我的代码中,我需要在哪里编写输出函数?

将uintptr_t添加到指针是否对称?

轮询libusb_pollfd struct 列表的正确方式是什么?

为什么将函数名括在括号中会禁用隐式声明?

如何在下面的C代码中正确管理内存?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

如何在GDB中查看MUSL的源代码

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

宏观;S C调深度

我的代码可以与一个编译器一起使用,但不能与其他编译器一起使用

Ubuntu编译:C中的文件格式无法识别错误

如何确定 C 程序中的可用堆内存

假设函数调用返回的 string(char *) 上有 free() 是否安全?