このパフォーマンスのコンテキストでは、参照は一般的にポインターよりも優れていますか?
はい、可能な場合は参照を使用し、必要な場合はポインタを使用してください。パフォーマンス面では、それらは同じです。
はい、余分なコピーを防ぐために、通常は参照またはポインタで大きな構造体を渡す方が良いでしょう。
ポインタまたは参照を介して変数またはオブジェクトにアクセスするのは、直接アクセスするのと同じくらい速い場合があります。この効率の理由は、マイクロプロセッサの構築方法にあります。関数内で宣言されたすべての非静的変数とオブジェクトはスタックに格納され、実際にはスタックポインターを基準にしてアドレス指定されます。同様に、クラスで宣言されたすべての非静的変数とオブジェクトは、C++では「this」として知られている暗黙のポインターを介してアクセスされます。したがって、適切に構造化されたC ++プログラムのほとんどの変数は、実際には何らかの方法でポインターを介してアクセスされていると結論付けることができます。したがって、マイクロプロセッサはポインタを効率的にするように設計する必要があり、それがマイクロプロセッサです。
ただし、いくつかの欠点がありますが、それらはポインタと参照の両方に適用されます。
ただし、ポインタと参照を使用することには欠点があります。最も重要なことは、ポインタまたは参照の値を保持するために追加のレジスタが必要です。特に32ビットモードでは、レジスタは不足しているリソースです。十分なレジスタがない場合は、ポインタを使用するたびにメモリからポインタをロードする必要があり、これによりプログラムの速度が低下します。もう1つの欠点は、ポインターの値が、ポイントされた変数にアクセスできる時間の数クロックサイクル前に必要になることです。
そして、ここにソースがあります。あなたがこの質問をしたなら、私はあなたがそれを良い読み物だと思うだろうと思います。
いくつかのコードを見てみましょう:
int x = 0;
00412E0E mov dword ptr [x],0
foo(x);
00412E15 lea eax,[x]
00412E18 push eax
00412E19 call foo (4111C2h)
00412E1E add esp,4
foo(&x);
00412E21 lea eax,[x]
00412E24 push eax
00412E25 call foo (4111BDh)
00412E2A add esp,4
関数を呼び出すときに違いはありません。
void foo (int& x)
{
00411370 push ebp
00411371 mov ebp,esp
00411373 sub esp,0C0h
00411379 push ebx
0041137A push esi
0041137B push edi
0041137C lea edi,[ebp-0C0h]
00411382 mov ecx,30h
00411387 mov eax,0CCCCCCCCh
0041138C rep stos dword ptr es:[edi]
x = 3;
0041138E mov eax,dword ptr [x]
00411391 mov dword ptr [eax],3
}
void foo (int* x)
{
004117A0 push ebp
004117A1 mov ebp,esp
004117A3 sub esp,0C0h
004117A9 push ebx
004117AA push esi
004117AB push edi
004117AC lea edi,[ebp-0C0h]
004117B2 mov ecx,30h
004117B7 mov eax,0CCCCCCCCh
004117BC rep stos dword ptr es:[edi]
*x = 3;
004117BE mov eax,dword ptr [x]
004117C1 mov dword ptr [eax],3
}
関数内に違いはありません。