ポインターを逆参照し、それを参照によって引数をとる関数に渡すと、オブジェクトのコピーが作成されますか?
4 に答える
この場合、ポインターの値がコピーされます (ただし、オプティマイザーが最適化する可能性があるため、必ずしもそうとは限りません)。
int val = *pPtr;
ただし、この場合、コピーは行われません。
int& rVal = *pPtr;
コピーが行われない理由は、参照がマシン コード レベルの構造ではないためです。これは高レベルの構造であるため、特定のコードを生成するのではなく、コンパイラが内部的に使用するものです。
明らかに、同じことが関数パラメーターにも当てはまります。
単純なケースでは、いいえ。ただし、より複雑なケースがあります。
void foo(float const& arg);
int * p = new int(7);
foo(*p);
ここでは、逆参照されたポインター ( int
) の型が関数パラメーターの基本型 ( ) と一致しないため、一時オブジェクトが作成されますfloat
。変換シーケンスが存在し、arg
const 参照であるため、変換された一時をバインドできます。
そうでないことを願っています: 呼び出された関数が引数を値で受け取る場合はそうなります。
さらに、それは参照の予想される動作です:
void inc(int &i) { ++i; }
int main()
{
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
}
このコードは、参照によって引数を取る1
ため、出力されることが期待されます。 inc
呼び出し時にコピーが作成されていたinc
場合、コードは0
.
いいえ。参照は多かれ少なかれ、表記が異なり、null 参照がないという制限を持つポインターと同じです。ただし、ポインターと同様に、オブジェクトのアドレスのみが含まれます。