アセンブリから見るポインタと参照の違い
リファレンスはc++言語の重要な概念であり、以下では主にアセンブリの観点からポインタとリファレンスの違いを比較する.
比較の初期化:
上のコードはそれぞれ参照とポインタを初期化し、両者に差がないことが分かったので、解いてから賦値操作を見てみましょう.
アセンブリコードから見ると、両者にも明らかな違いはありません.では、両者の参照を見てみましょう.
コードを通じて、私たちも明らかな違いを発見しませんでした.結論:アセンブリコードには参照の概念は存在しない.では、引用とポインタの違いはどこにあるのでしょうか.コンパイラの両方の異なる処理に依存します.たとえば、2段のポインタがありますが、2段の参照はありません.空のポインタは使用できますが、参照を使用する前に初期化する必要があります.
比較の初期化:
11: int &b = a;
004133D5 8D 45 F8 lea eax,[a]
004133D8 89 45 EC mov dword ptr [b],eax
12: int *c = &a;
004133DB 8D 45 F8 lea eax,[a]
004133DE 89 45 E0 mov dword ptr [c],eax
上のコードはそれぞれ参照とポインタを初期化し、両者に差がないことが分かったので、解いてから賦値操作を見てみましょう.
14: b = 4;
004133E1 8B 45 EC mov eax,dword ptr [b]
004133E4 C7 00 04 00 00 00 mov dword ptr [eax],4
17: *c = 5;
00413407 8B 45 E0 mov eax,dword ptr [c]
0041340A C7 00 05 00 00 00 mov dword ptr [eax],5
アセンブリコードから見ると、両者にも明らかな違いはありません.では、両者の参照を見てみましょう.
20: int d = b;
0041342D 8B 45 EC mov eax,dword ptr [b]
00413430 8B 08 mov ecx,dword ptr [eax]
00413432 89 4D D4 mov dword ptr [d],ecx
21: int e = *c;
00413435 8B 45 E0 mov eax,dword ptr [c]
00413438 8B 08 mov ecx,dword ptr [eax]
0041343A 89 4D C8 mov dword ptr [e],ecx
コードを通じて、私たちも明らかな違いを発見しませんでした.結論:アセンブリコードには参照の概念は存在しない.では、引用とポインタの違いはどこにあるのでしょうか.コンパイラの両方の異なる処理に依存します.たとえば、2段のポインタがありますが、2段の参照はありません.空のポインタは使用できますが、参照を使用する前に初期化する必要があります.