これに対する MS VC コンパイラの動作を理解するのに苦労しています。この行は正常にコンパイルされますが、得られる結果は私が期待するものとはまったく異なります。
this->Test((char *)&CS2 - (char *)&CS1 == sizeof(void *));
CS1 および CS2 引数は次のように宣言されます。
myFunction(tCS1* CS1, tCS2* CS2) {...
tCS1 と tCS2 は、それぞれ 1 つの int と 1 つの __int64 を含む構造体です。
これは、両方のポインターである引数 CS1 と CS2 の間のスタック上の距離を確認するためのものです。この行で実行を中断し、デバッガーを使用して 2 つの変数のアドレスを取得すると、実際には互いに 8 バイト離れていることがわかります (x64 プラットフォーム)。
ただし、比較の結果は false です。
コンパイラによって生成されたアセンブリ コードは次のとおりです。
mov rax,qword ptr [CS1]
mov rdi,qword ptr [CS2]
sub rdi,rax
(次に、rdi に格納された結果を使用して比較を行い、呼び出しを行います)
はい、コンパイラはアドレスではなく、ポインター引数の値を比較しています。ここには間接的なレベルがありません。どこに行ったのですか?
もちろん、これをテスト環境で再現することはできず、どこを見ればよいかわかりません。私は 32 ビット マシン上のこのコードを x64 プラットフォームにクロスコンパイルしています (そうしなければなりません)。それが唯一の「奇妙な」点です。アイデア、ヒントはありますか?