c - 在 C 中交换值的最快方法是什么?

标签 c performance

我想交换两个整数,我想知道这两种实现中哪一种会更快: 使用临时变量的明显方法:

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;
}

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

最佳答案

第 2 种方法经常被引用为“聪明”的做法。它实际上很可能更慢,因为它掩盖了程序员的明确目标——交换两个变量。这意味着编译器无法优化它以使用实际的汇编程序操作进行交换。它还假定能够对对象执行按位异或。

坚持第 1 点,这是最通用和最容易理解的交换,可以很容易地模板化/通用化。

这个维基百科部分很好地解释了这些问题: http://en.wikipedia.org/wiki/XOR_swap_algorithm#Reasons_for_avoidance_in_practice

关于c - 在 C 中交换值的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36906/

相关文章:

c - SIMD 将 12 位字段解包为 16 位

PHP地雷一般

python - N == N 的数字和的某次幂(运行太慢)

c++ - 包含的 C++/C 头文件的实现在哪里?

objective-c - iOS 动画性能

javascript - 使用 BeanShell 预处理器发送 JSON 对象时出现问题

java - 列表与 map : Which takes less space and more efficient?

需要全面清晰的 NOP sled 技术解释

c - 为什么 n++ 当它是 sizeof() 函数的参数时不起作用?

c - 需要帮助解决不可分页内存的内存问题