c - 为什么人们不使用异或交换?

标签 c swap xor premature-optimization

<分区>

我在一个网站上看到,使用异或交换很快,因为它不使用临时变量。这是一个例子:

#include <stdio.h>

int main(void)
{        
    int a=234,b=789;
    b=b^a;
    a=b^a;
    b=b^a;
    printf("a=%d,b=%d",a,b);
    return 0;
}

为什么人们不在现实代码中使用这种技术?只是风格不好吗?有什么地方没有明确定义吗?这是我的编译器可能会自动从更清晰的代码中生成的优化吗?

最佳答案

对于现代编译器和 CPU,使用 tmp 变量既更快更具可读性。 2x 加载到寄存器中,然后 2x 存储回原始位置。

或者如果一个或两个变量已经在寄存器中,编译器可能会完全优化临时变量。如果异或交换在某个假设的机器上更快,一个好的编译器会在优化 tmp = a; 时为你使用它。一 = b; b = tmp; 所以你不需要显式地写它。这就是您使用 C 而不是在 asm 中手写的原因。

此外,xor-swap 仅适用于整数。如果你想交换 float 怎么办?字符串?自定义对象?等等

关于c - 为什么人们不使用异或交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16535461/

相关文章:

写入文件时转储​​ C 程序核心

c - C代码中的浮点异常!

c - 在 C 中交换两个 vector

编译后的c程序内存地址

C - 交换双向链表中的第一个和最后一个元素

android - 我的交换两个 View 背景的代码不起作用

java - 如果给定两个十六进制数,用格雷码判断它们是否可以连续

C - 使用 fscanf 从文件中读取十六进制和字符

Swift Biginteger xor 加密/解密

c - Eratosthenes 筛法 C 代码