Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么不';人们不使用异或交换吗?_C_Swap_Xor_Premature Optimization - Fatal编程技术网

C 为什么不';人们不使用异或交换吗?

C 为什么不';人们不使用异或交换吗?,c,swap,xor,premature-optimization,C,Swap,Xor,Premature Optimization,我在一个网站上读到,使用xor交换很快,因为它不使用临时变量。下面是一个例子: #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; } #包括 内部主(空) { INTA=234,b=789; b=b^a; a=b^a; b=b^a; p

我在一个网站上读到,使用xor交换很快,因为它不使用临时变量。下面是一个例子:

#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;
}
#包括
内部主(空)
{        
INTA=234,b=789;
b=b^a;
a=b^a;
b=b^a;
printf(“a=%d,b=%d”,a,b);
返回0;
}

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

使用tmp变量在现代编译器和CPU中速度更快、可读性更强。2x加载到寄存器中,然后2x存储回原始位置

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


此外,异或交换仅适用于整数。如果你想交换浮点数呢?串?自定义对象?等等。

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

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


此外,异或交换仅适用于整数。如果你想交换浮点数呢?串?自定义对象?等等。

性能增益通常非常小,以至于“可理解代码”的成本高于获得的速度效益。

性能增益通常非常小,以至于“可理解代码”的成本高于获得的速度效益

  • 虽然没有显式临时变量,但在写入寄存器之前,结果实际上存储在隐式临时变量中

  • 使用xor交换,您需要确保交换的变量不同。否则,这两项都应评估为0

  • 虽然没有显式临时变量,但在写入寄存器之前,结果实际上存储在隐式临时变量中

  • 使用xor交换,您需要确保交换的变量不同。否则,这两项都应评估为0


  • <所有的答案都已经存在了,认为它只是一个加法-< /p> ->若两个值都用于相同的内存地址,结果将为零

    ->编译器可以优化原始交换中的临时变量

    ->现代CPU力求通过指令管道并行执行指令 但是使用XOR技术要比使用临时变量进行交换慢得多,因为每个操作都取决于前一个操作的结果


    -x+y可能为整数溢出

    所有答案都已经存在,认为它只是加法-< /p> ->若两个值都用于相同的内存地址,结果将为零

    ->编译器可以优化原始交换中的临时变量

    ->现代CPU力求通过指令管道并行执行指令 但是使用XOR技术要比使用临时变量进行交换慢得多,因为每个操作都取决于前一个操作的结果


    ->x+Y可能会出现整数溢出

    我怀疑是否有很多证据表明它通常会更快(如果有的话)。@xaxx你想提醒我该页面的哪一部分?喋喋不休的开放式问题会降低我们网站的有用性,并将其他问题推到首页。我问的所有问题都有直截了当的答案,其中大多数都是封闭式问题,只需要回答“是”或“否”。这个问题很有建设性,因为它很可能鼓励未来的访问者使用比xor交换更便携的方法。我认为你不会因为这些理由而结束这个问题。即使你这样做了,我也会很快让它重新打开;)我想只要你说“人们为什么不……”你就和stackoverflow无关了。此外,询问stack overflow的核心任务之外的风格趋势。这类问题应该出现在某个博客上,我很确定这不是一个真正的问题。你已经知道答案了,你正在半自动地寻找你认为在stackoverflow上常见问题的答案,但是stackoverflow明确地认为它们不属于这里。我真的认为你应该开一个编程博客,在那里发布这种东西。我怀疑有很多证据表明它经常(如果有的话)会更快。@xaxxon你想提醒我的是页面的哪一部分?聊天,开放式问题降低了我们网站的实用性,并将其他问题从头版推到了一边。我问的所有问题都有直截了当的答案,其中大多数都是封闭式问题,只需要回答“是”或“否”。这个问题很有建设性,因为它很可能鼓励未来的访问者使用比xor交换更便携的方法。我认为你不会因为这些理由而结束这个问题。即使你这样做了,我也会很快让它重新打开;)我想只要你说“人们为什么不……”你就和stackoverflow无关了。此外,询问stack overflow的核心任务之外的风格趋势。这类问题应该出现在某个博客上,我很确定这不是一个真正的问题。你已经知道答案了,你正在半自动地寻找你认为在stackoverflow上常见问题的答案,但是stackoverflow明确地认为它们不属于这里。我真的