2017-06-27 8 views
2

answerを読んだあと、リファレンスが実際にメモリを占有しているかどうかはわかりません。コンパイラが参照を参照変数に置き換えるときに、参照変数との参照を交換するときに、メモリを占有しないことになります。参照は実際にメモリを占有できますか?

しかし、一般的なケースでは

、コンパイラは通常のポインタとしての参照を実装します。しかし、彼らは一般的に参照が指すものについてより多くの情報を持っており、最適化のためにそれを使用します。

ポインタがメモリを占有しているため、コンパイラがポインタを作成して以来、その参照がメモリを占有することはありませんか?コンパイラが単にリファレンスをスワップするのではなくポインタにする場合、リファレンスは実際にはメモリを占有していますが、わずかな暗黙的な方法で有効でしょうか?

実際、コンパイラはいつ参照をポインタとして実装し、スワップしないか、またはコンパイラとコンパイラとで異なるのですか?

+1

すべての実装が定義されています。リファレンスは、標準規格ごとにスペースを取る必要はありません。 – NathanOliver

+0

「これはすべて実装が定義されています」という最後の部分に感謝しました。しかし、コンパイラが実際に参照をポインタにすることを選択した場合、参照がわずかな暗黙的な方法でメモリを占有していると言うのは有効でしょうか? @ NathanOliver –

+1

はい、参照が実際にポインタの場合、スペースを占有しています。アセンブリを調べていないかどうかはわかりません。 – NathanOliver

答えて

1

リファレンスは、クラスのメンバーであれば間違いなくスペースを占有します。たとえば :

class A{ 
public: 
    A(int &refval):m_ref(refval){}; 
private: 
    int &m_ref; 
} 

コンパイラは単に定数ポインタとしてこの変数を扱います。あなたはスコープ内の一時変数としてそれを使用している場合

はしかし、それはメモリを使用する理由がありません:

void func(int &a){ 
    int &a_ref = a; 
} 

コンパイラはちょうど実際の変数に参照を置き換えます。

+0

うわー。リファレンスがポインタとして扱われたときには実装固有のものだと思っていました。リファレンスがポインタとして扱われるとき、あるいはネイサンとピートが言うものとは逆のときを定義しています。または私は何かを誤解していますか? –

+0

実装固有です。しかし、私が知っているすべてのコンパイラは、このメソッドを使用します。たぶん、特定の状況(参照が同じオブジェクトのメンバに初期化されたときと同じですが、これを行うことはありません)のように、クラス内の領域を最適化できますが、コンパイラがこの。実際には、私は参照のためのポインタを使用する以外の解決策を想像することはできません。 – geza

+0

@gezaああ、大丈夫です。しかし、ポインタがメモリを占有し、参照がそうでない場合、どのようにポインタから参照への変換をコンパイラによる最適化とみなすことができますか? –

関連する問題