4

この質問から、そしてその結果、標準 (ISO C++-03) から:

参照がストレージを必要とするかどうかは指定されていません (3.7)。

そのスレッドのいくつかの回答では、参照は内部的にポインターと同じ構造を持っているため、同じサイズ (32/64 ビット) であると言われています。

私が把握するのに苦労しているのは、どのようにして参照がストレージを必要としないようになるのでしょうか?

これを例示するサンプルコードは大歓迎です。

編集: @ JohannesSchaub-litb コメントから、 を使用していない場合const &、またはconst &をデフォルト値で使用している場合、割り当てが必要ですか? どういうわけか、参照の割り当てはまったくあってはならないように思えます-もちろん、次のような明示的な割り当てがある場合を除きます。

A& new_reference(*(new A())); // Only A() instance would be allocated,
                              // not the new_reference itself

このようなケースはありますか?

4

2 に答える 2

5

簡単なことを考えてみましょう:

int foo() {
  int  x = 5;
  int& r = x;
  r = 10;
  return x;
}

実装x、その参照を実装するために舞台裏へのポインターを使用する場合がありますが、そうしなければならない理由はありません。コードを次の同等の形式に変換することもできます。

int foo() {
  int x = 10
  return x;
}

その場合、ポインターはまったく必要ありません。コンパイラは、 を指すポインターを格納および逆参照することなくr、 と同じ実行可能ファイルに直接焼き付けることができます。xx

ポイントは、参照がストレージを必要とするかどうかは、気にする必要のない実装の詳細です。

于 2013-02-10T16:14:14.917 に答える
0

理解するための重要なポイントは、参照型はオブジェクト型ではないということだと思います。

オブジェクト型は、関数型でも、参照型でも、void型でもない(おそらくcv修飾された)型です。(§3.9[basic.types]/8)

オブジェクトにはストレージが必要です(「オブジェクトはストレージの領域です。」-§1.8[intro.object] / 1)

さらに、C ++プログラムはオブジェクトを操作します。「C++プログラムの構成要素は、オブジェクトを作成、破棄、参照、アクセス、および操作します。」-同じ段落

したがって、コンパイラがプログラムで参照に遭遇した場合、オブジェクト(通常はポインタ型)を合成する必要があるかどうかはコンパイラ次第です。したがって、ストレージを使用するか、目的の実装を行う他の方法を見つける必要があります。オブジェクトモデルに関するセマンティクス(ストレージを含まない場合があります)。

于 2013-02-10T18:00:02.687 に答える