アセンブリから見るポインタと参照の違い


リファレンスはc++言語の重要な概念であり、以下では主にアセンブリの観点からポインタとリファレンスの違いを比較する.
比較の初期化:
    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段の参照はありません.空のポインタは使用できますが、参照を使用する前に初期化する必要があります.