1

私の理解では、左辺値は単なる場所であり、対応する右辺値はその場所に格納されている値です。例えば:

int x;
x = 0; /* the compiler will replace x with the location where 0 will be stored */
int y = x; /* x works as an rvalue here, its content is unknown until run time */

コンパイラはコンパイル時に x の値が 0 であることを 3 行目で認識できるので、y を値 0 で直接初期化できます (実行時まで待機し、実行時に最初に x の値を取得してから与えるのではなく)その値を y) に?

int *p = &x;
*p = 3;

ここで、2 行目の *p は左辺値 (x の位置) です。&x はコンパイル時にわかるので、*p もコンパイル時にわかりますよね?

コンパイラは単純に *p を x の位置に置き換えますか? それとも、最初に p に格納されているアドレスを取得し、次にそのアドレスに 3 を割り当てるコードを生成しますか?

4

2 に答える 2

2

あなたが何をしたいのか、左辺値または右辺値と関係があるかどうかはわかりません。私が間違っている場合は訂正してください。ただし、大まかに言えば、コンパイル時に決定されるものは実行時に計算を行わないことを保証することにより、いくつかの「手動最適化」を行いたいと感じています。これを行うには多くの方法があり、他の方法よりも複雑なものもあります。

あなたが投稿した 2 つの例から、const 修飾子と static 修飾子、および C++11 の新しいconstexprキーワードに関心を持つことをお勧めします。const一般的に言えば、できるときは書くことを忘れないでください。最適化中にコンパイラを本当に助けます。それstaticはまた別の話です。プログラミングの経験が豊富な場合にのみ、特定の場合にのみ使用し、宗教的に完全に使用することに反対する人がいる場合にのみ使用すると、誰にとっても安全であることがわかります...

最適化についてもう少し知りたい場合は、このウェブサイトをお勧めします。もちろん、コンパイル時に計算を行うのに役立つテンプレートメタプログラミングもあります。

あなたの例に戻ると、なぜそのようなことを書き、コンパイラーがあなたのために仕事をすることを期待するのでしょうか? 0 であることがわかっている場合yは、自分で書いてみませんか? の値がy後で変更される場合、メモリ内にスペースを割り当てる以外yに、コードがそれを使用して "開始" するとき (実行時) に値 0 をこの場所にコピーする方法はありますか? y実行時にしか解決できない条件に応じての値が設定された場合はどうなるでしょうか? 等。

最適化は本当にエキサイティングですが、開発の最初に来るべきではありません。何かをプログラムし、それがより速く実行できると思う場合は、その方法を自問してみてください。ただし、ほとんどの場合、各命令を最適化しようとしても役に立たない (そして危険であり、非効率的です)。

効率の名の下に (必ずしも効率を達成する必要はありませんが) 計算上の罪が犯されているのは、盲目的な愚かさを含む他の単一の理由よりも多くあります。」、WA Wulf

于 2013-05-06T21:41:55.723 に答える
-2

int y = x式では、変数が右辺値であるとは言いませんx。右辺にあるという事実は、それが r 値であることを意味しません。

定義上、左辺値は、次のようなメモリ内の識別可能な場所を占有するオブジェクトxです。右辺値は、左辺値ではない単純なオブジェクトです

したがって、式がint y = x1 + x2の場合、はい、一時的なものは右辺値になりますが、あなたの場合、定義さx1 + x2れているスコープの存続期間中、メモリ内に識別可能な場所があるため、左辺値です。xx

于 2013-05-06T21:01:10.710 に答える