1

一時変数を使用しないため、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;
}

実際のコードでこの手法を使用しないのはなぜですか? スタイル悪いだけじゃね?それについて明確に定義されていないものはありますか?私のコンパイラがより明確なコードから自動的に生成する最適化ですか?

4

4 に答える 4

22

tmp 変数を使用すると、最新のコンパイラと CPU で高速かつ読みやすくなります。レジスタに 2 回ロードしてから、元の場所に 2 回ストアします。

または、一方または両方の変数が既にレジスターにある場合、コンパイラーは一時的に完全に最適化する可能性があります。いくつかの仮想マシンで xor-swapping がより高速である場合、優れたコンパイラは最適化時にそれを使用するためtmp = a; a = b; b = tmp; 、明示的に記述する必要はありません。これが、asm で手書きではなく、C を使用している理由です。

また、xor-swap は整数に対してのみ機能します。浮動小数点数を交換したい場合はどうしますか? 弦?カスタムオブジェクト? 等

于 2013-05-14T05:04:49.673 に答える
3
  1. 明示的な一時変数はありませんが、結果は実際にはレジスタに書き込まれる前に暗黙的な一時変数に格納されます。

  2. xor スワップでは、スワップされる変数が同じでないことを確認する必要があります。それ以外の場合、両方とも 0 と評価されます。

于 2013-05-14T05:10:46.530 に答える
1

通常、パフォーマンスの向上は非常に小さいため、「理解可能なコード」へのコストは、得られる速度のメリットよりも高くなります。

于 2013-05-14T05:04:58.633 に答える