12

重複の可能性:
C ++でポインターを逆参照するのにどれくらいの費用がかかりますか?

オブジェクトへのポインタがある場合、たとえば、それを、次のように記述する必要があることを理解してObject *ptr;いる形式のメソッドに渡したいとします。void foo(Object& obj)

foo(*ptr);

しかし、なぜ間接参照するのptrですか?ただ渡すのは理にかなっているのではないでしょうfoo(ptr);か?元のオブジェクトのコピー*ptrを作成するのではないか、少なくとも作業対象のアドレスに渡すだけではないのではないかと心配しています。foo

誰かが私のためにこれを片付けることができますか?関数が呼び出されて呼び出さ*ptrれた場合と同じように高速に動作することを期待するコードの場合、潜在的なボトルネックを通過していますか?void foo(Object *obj);foo(ptr)

4

5 に答える 5

14

*ptr が元のオブジェクトのコピーを作成しているのではないかと心配しています。

あなたが間違っている。ポインターを逆参照してもコピーは作成されません!

void f(Object & obj); //note it takes the argument by reference

Object *ptr = get();

foo(*ptr); 

このコードの最後の行にはコピーがありません。規格はその保証を提供します。

ただし、f引数を値で受け取る場合は、コピーがあります。

結論: 関数パラメーター内の参照は、コピーを回避するために(多くの場合)、または出力パラメーターとして (場合によっては) 使用されます。

于 2013-01-07T10:07:11.193 に答える
13

渡す*ptrことでコピーが作成されるかどうかは、呼び出された関数がObjectまたは を期待しているかどうかによって異なりObject &ます。

前者の場合、コピーが作成されます。後者の場合 (つまり、あなたの場合)、コピーは作成されません。

于 2013-01-07T10:09:36.870 に答える
1

参照によってオブジェクトを渡すと、ポインターが渡されるだけなので、 foo(*ptr) は正しく、オブジェクトをコピーしません。なぜそれを逆参照するのですか?関数シグネチャは、オブジェクトへのポインターではなく、オブジェクトを必要とするためです。C++ は厳密に型指定された言語です。

于 2013-01-07T10:09:01.253 に答える
0

関数への参照を渡すには、値のセマンティクスと同じようにオブジェクトを渡す必要があります。ポインタはエンティティ セマンティクス (アドレス) であるため、参照ではありません。

ポインターを逆参照すると、参照として埋め込むことができる実際の値が得られます。

于 2013-01-07T10:09:31.407 に答える
0

参照とポインタは同じです。ただし、参照には独自の利点があり、null にすることはできません (可能ですが、null 参照を作成するのはちょっと難しいです) ため、nullptr に対するチェックを省略できます。使用できます。-> の代わりに、xD より短い文字です。あなたの質問については、ポインタは参照であるため、最終的には同じものを選択しても何の利益もありません。以下のコードはコンパイル時に同じであることを意味します。

void foo(int &r) {}

void foo(int *p) {}

参照を使用すると、バックグラウンドで参照解除が行われます。それが役に立ったことを願っています。

于 2013-01-07T10:23:46.217 に答える