参照はC++のポインターと見なされますか?
int &x = y;
xのメモリにスペースはありますか?
実装に依存し、標準では指定されていません。コンパイラはint &x
、それをポインタであるかのように扱い、スタック上にスペースを作ることがあります。CPUレジスタでハングアップする可能性があります(したがって、スタックスペースは必要ありません)。それが既存のオブジェクトの別の名前であることに気づき、実行時に 2 つを混同する場合があります。
使用方法に応じて、コンパイラが参照を使用してさまざまなことを行う方法の例として、いくつかの状況を次に示します。
次のような関数で:
int foo( int x )
{
int &y = x;
y += 2;
return y + x;
}
MSVC のようなコンパイラは、単に y を x のエイリアス (同じ変数の別の名前) と見なし、コンパイル中にyのすべての言及をxに静かに置き換えます。したがって、関数は実際にはあたかもそうであるかのようにコンパイルされます
int foo( int x )
{
x += 2;
return x + x;
}
ただし、参照をパラメーターとして使用すると、
int foo( int &x )
{
x += 2;
return x;
}
次に、xはポインターとして内部的に実装され、他のパラメーターと同様にスタック上の関数に渡されます。コンパイラは、次のように処理します。
int foo( int *x )
{
(*x) += 2;
return *x;
}
要点は、質問に対する答えは、使用しているコンパイラだけでなく、作成している特定のコードにも依存するということです。いかなる方法でも標準で指定されていません。
参照が内部でポインタとして実装されることは非常に一般的です。Itanium C ++ ABIは、パラメーターのポインターを指定します。
3.1.2参照パラメータ
参照パラメーターは、実際のパラメーターへのポインターを渡すことによって処理されます。
はい、参照はメモリを使用します。その実装が事実上ポインタである場合、それはポインタサイズになります。参照の実装方法は実装によって定義されます。
編集
Jesse Goodが標準から引用しているように、参照にストレージが必要かどうかは指定されていません。
関数の引数として参照を渡すことは、おそらくポインターを渡すことで機能します。あなたの例のように、同じスコープ内の既存の変数への参照を宣言すると、おそらく両方の名前がメモリ内の同じ場所を参照するようになります。しかし、これは実装に依存します。コンパイラが異なれば、それが異なる場合があります。