値による呼び出しと参照による const 呼び出しの違いについて少し混乱しています。誰かが私にこれを説明してくれませんか。たとえば、どちらも callers 引数の変更から保護しますか? すべてのオブジェクト サイズに対して高速ですか? どちらかが引数をコピーしますが、一方はコピーしませんか? コピーを作成するときにどちらがより多くのメモリを使用しますか?
7336 次
5 に答える
0
私はあなたが間の違いを意味すると思います:
void Fn1(MyType x);
と
void Fn2(const MyType& x);
前者の場合、オブジェクトのコピーが常に作成されるため、特に型に自明でないコンストラクターがある場合は遅くなります。元のオブジェクトは、関数内のコピーに対して行われた変更の影響を受けませんが、コピー自体は変更できます。
後者の例ではコピーは作成されず、一般的に高速になります。関数内では、引数でconst関数のみを呼び出すことができます(constnessをキャストするなどの汚いトリックに頼らない限り)。したがって、オブジェクトが変更されないことが保証されます。
重要:この説明では、スマートポインターなど、特別なセマンティクスを持つ型については説明していません。その場合でも、値による呼び出しでは、論理的に同じオブジェクト、つまりスマートptrインスタンス自体ではなく、それが指すオブジェクトを変更できます。
だからここにあなたの質問への答えがあります:
- どちらも呼び出し元の引数の変更を防ぎますか:はい、元のオブジェクトは変更されません(トリックを除く)
- それらはすべてのオブジェクトサイズで高速ですか:同じように高速ではありません-コンパイラの最適化に応じて、速度がほぼ同じか、場合によってはわずかに高速である一部のプリミティブ型を除いて、参照による呼び出しは一般に高速です。
- 引数をコピーしないでください:値による呼び出しはコピーを作成しますが、参照による呼び出しは作成しません
- コピーを作成するときに、より多くのメモリを使用しますか?参照による呼び出しはコピーを作成しないため、答えは明確です
于 2013-03-11T22:47:35.593 に答える