7

右辺値にメモリアドレスがないのはなぜですか? プログラムの実行時に RAM にロードされませんか、それともプロセッサ レジスタに格納された値を参照しますか?

4

5 に答える 5

10

あなたの質問(「右辺値にメモリアドレスがないのはなぜですか?」)は少し混乱しています。右辺値は一種の式です。 にはアドレスがありません 。オブジェクトにはアドレスがあります。「アドレス演算子を右辺値式に適用できないのはなぜですか?」と尋ねる方が正しいでしょう。

その答えはかなり単純です。オブジェクトのアドレスのみを取得でき、すべての右辺値式がオブジェクトを参照するわけではありません(たとえば、式42には値がありますが、オブジェクトを参照していません)。

一部の右辺値式はオブジェクトを参照しますが、そのようなオブジェクトには永続性がありません。右辺値式によって参照されるオブジェクトは一時オブジェクトであり、それが作成された式の最後で破棄されます。このようなオブジェクトには実際にアドレスがあります(一時オブジェクトのメンバー関数を呼び出すことで簡単に見つけることができます。thisポインターは一時オブジェクトを指している必要があるため、一時オブジェクトにはアドレスが必要です)。

これが左辺値式と右辺値式の根本的な違いです。左辺値式は、永続性を持つオブジェクトを参照します。左辺値式が参照するオブジェクトは、単一の式を超えて永続化します

于 2011-09-10T06:59:02.980 に答える
1

rvalueと考えてください。自体にはアドレスがありません。ただし、式に含まれるオブジェクトにはアドレスがあります。一時的なオブジェクトであっても、オブジェクトのアドレスを取得できます。

このことを考慮、

const int & i = 10; //ok

ここで、10は右辺値であるため、 のアドレスであることわかります。いいえ、それは間違っています。は、式から作成されるタイプの一時オブジェクトのアドレスです。また、一時オブジェクトは非 const 参照にバインドできないため、 を使用します。つまり、以下はエラーです。&i10&iint10const

int & i = 10; //error
于 2011-09-10T06:53:13.927 に答える
-1

つまり、右辺値にはアドレスがあります。した事がある

Type const value& = rvalue;
Type const* address = &value;
于 2011-09-10T06:52:46.803 に答える
-2

単にこのケースを取る

int a = 1 + 2;

1+2 は 3 に解決されます。

自問してみてください:

  • 3 はオブジェクトですか?
  • 3 はメモリ内のどこに配置されますか?

オブジェクトのアドレスが必要な場合は、& を使用します。

右辺値がアドレス指定可能である場合、コンピューターが格納することを決定した場所へのポインターを宣言できることを意味します 3

int* a = &3;

それは正しいと思いますか?:)

于 2011-09-10T07:04:22.757 に答える