48

ポインターを逆参照し、それを参照によって引数をとる関数に渡すと、オブジェクトのコピーが作成されますか?

4

4 に答える 4

42

この場合、ポインターの値がコピーされます (ただし、オプティマイザーが最適化する可能性があるため、必ずしもそうとは限りません)。

int val = *pPtr;

ただし、この場合、コピーは行われません。

int& rVal = *pPtr;

コピーが行われない理由は、参照がマシン コード レベルの構造ではないためです。これは高レベルの構造であるため、特定のコードを生成するのではなく、コンパイラが内部的に使用するものです。

明らかに、同じことが関数パラメーターにも当てはまります。

于 2010-12-14T07:30:44.450 に答える
8

単純なケースでは、いいえ。ただし、より複雑なケースがあります。

void foo(float const& arg);
int * p = new int(7);
foo(*p);

ここでは、逆参照されたポインター ( int) の型が関数パラメーターの基本型 ( ) と一致しないため、一時オブジェクトが作成されますfloat。変換シーケンスが存在し、argconst 参照であるため、変換された一時をバインドできます。

于 2010-12-14T09:32:40.603 に答える
4

そうでないことを願っています: 呼び出された関数が引数を値で受け取る場合はそうなります。

さらに、それは参照の予想される動作です:

void inc(int &i) { ++i; }

int main()
{
    int i = 0;
    int *j = &i;
    inc(*j);
    std::cout << i << std::endl;
}

このコードは、参照によって引数を取る1 ため、出力されることが期待されます。 inc呼び出し時にコピーが作成されていたinc場合、コードは0.

于 2010-12-14T07:25:55.560 に答える
3

いいえ。参照は多かれ少なかれ、表記が異なり、null 参照がないという制限を持つポインターと同じです。ただし、ポインターと同様に、オブジェクトのアドレスのみが含まれます。

于 2010-12-14T07:26:51.250 に答える