3つ目の変数を使用せずに2つの変数を交換する際に、どのようにしてオーバーフローが発生するかを考慮することができます。私は、XORソリューションは整数にしか使えないと信じています。他の変数型はどうですか?SWAP中のスタックオーバーフロー
答えて
これは答えではありませんが、コメントには当てはまりません。
スワップ用の一時変数をさらに使用すると、問題が発生する可能性があるため、使用可能なスタックストレージの端に近い状況で実行していますか?
いくつかの埋め込みシナリオを見ることができましたが、アセンブリ言語でコードを記述していない場所でスタック空間が非常に狭いシナリオを想像するのは難しいです。
XORソリューションは、整数だけでなくビット単位でコピーできるあらゆるタイプで動作します。ただし、変数自体をXORしないでください。すなわち、
int x = 10;
int *p1 = &x;
int *p2 = p1;
*p1 = *p1^*p2;
*p2 = *p1^*p2;
*p1 = *p1^*p2;
/* now x == 0 :(*/
これをまったく実行しないでください。 XORスワップアルゴリズムはクールなハックです。プロダクトコードのshouldn't be used。
XCHGの何が問題になっていますか?スタック不要、オーバーフローなし(キャリーフラグ)?どちらかを設定してください:)。
この回答のリンクを読み、脚注2に従って読んでください。一言で言えば、それはCPUキャッシュを駄目にし、それゆえ遅くなる。 http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –
OOps、私はクリックに注意する必要があります、私は本当にそのコメントを投票することを意味しませんでしたが、お楽しみください;) 私はXCHGのインテルの取扱説明書を読み直し、指定されたオペランドへの非自然アライメントアクセスのキャッシュペナルティに気付きました。たぶん私は何かが不足しているが、C/C++のXCHGをインラインで64ビットMSVCを保存することができ、非整数型の使用を含む2つの変数をスワップするときにスタックを使用しないという問題があると思います。 また、他の人が尋ねたように、この質問は実際には言語固有のようではないので、アセンブリはA-OK IMHOです。 – RandomNickName42
a = a + b;
b = a - b;
a = a - b;
これは整数と浮動小数点数に対して機能します。
この回答のリンクを読み、脚注2に従って読んでください。要するに、単純なスワップよりも多くのメモリとCPUサイクルが必要です。 http://stackoverflow.com/questions/717935/stack-overflow-during-swap/717984#717984 –
他のタイプは?どの言語、btw? – Aziz
ちょうど勘違いしています...これはコピーコンストラクタでスワップが起こっているC++ではありませんか? –