2009-04-04 8 views
2

3つ目の変数を使用せずに2つの変数を交換する際に、どのようにしてオーバーフローが発生するかを考慮することができます。私は、XORソリューションは整数にしか使えないと信じています。他の変数型はどうですか?SWAP中のスタックオーバーフロー

+0

他のタイプは?どの言語、btw? – Aziz

+0

ちょうど勘違いしています...これはコピーコンストラクタでスワップが起こっているC++ではありませんか? –

答えて

2

XORは、あなたのXOR演算子が処理することができるものであれば動作します。これはバイナリデータのプロパティであり、整数を表すバイナリデータのプロパティではありません。

+0

XOR演算子が実際にXOR演算を実行している場合にのみ、演算子のオーバーロードを可能にする言語で、何か変なことをするためにオーバーロードされている場合ではありません。 –

+0

Ugh;ええ、それは本当であり、言及する価値があります。ありがとう。 – chaos

+0

したがって、データを整数型または文字型の配列にキャストし、その要素に対してxorを実行します。 – paxdiablo

4

これは答えではありませんが、コメントには当てはまりません。

スワップ用の一時変数をさらに使用すると、問題が発生する可能性があるため、使用可能なスタックストレージの端に近い状況で実行していますか?

いくつかの埋め込みシナリオを見ることができましたが、アセンブリ言語でコードを記述していない場所でスタック空間が非常に狭いシナリオを想像するのは難しいです。

0

XORソリューションは、整数だけでなくビット単位でコピーできるあらゆるタイプで動作します。ただし、変数自体をXORしないでください。すなわち、

int x = 10; 
int *p1 = &x; 
int *p2 = p1; 

*p1 = *p1^*p2; 
*p2 = *p1^*p2; 
*p1 = *p1^*p2; 

/* now x == 0 :(*/ 
2

これをまったく実行しないでください。 XORスワップアルゴリズムはクールなハックです。プロダクトコードのshouldn't be used

0

XCHGの何が問題になっていますか?スタック不要、オーバーフローなし(キャリーフラグ)?どちらかを設定してください:)。

+1

この回答のリンクを読み、脚注2に従って読んでください。一言で言えば、それはCPUキャッシュを駄目にし、それゆえ遅くなる。 http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –

+0

OOps、私はクリックに注意する必要があります、私は本当にそのコメントを投票することを意味しませんでしたが、お楽しみください;) 私はXCHGのインテルの取扱説明書を読み直し、指定されたオペランドへの非自然アライメントアクセスのキャッシュペナルティに気付きました。たぶん私は何かが不足しているが、C/C++のXCHGをインラインで64ビットMSVCを保存することができ、非整数型の使用を含む2つの変数をスワップするときにスタックを使用しないという問題があると思います。 また、他の人が尋ねたように、この質問は実際には言語固有のようではないので、アセンブリはA-OK IMHOです。 – RandomNickName42

0
a = a + b; 
b = a - b; 
a = a - b; 

これは整数と浮動小数点数に対して機能します。

+0

この回答のリンクを読み、脚注2に従って読んでください。要するに、単純なスワップよりも多くのメモリとCPUサイクルが必要です。 http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –