38

私は K&R を読んでいて、レジスタ変数に関する小さなセクションにたどり着きました。ここの人々がこれを実践した良い例を持っているかどうか疑問に思っていました。

K&R のセクション 4.7 から:

register 宣言は
register int x;のようになります。
文字 c を登録します。

明確にするために、私はいくつかのクールなコード サンプルを見たいと思っています。私は主題を理解していると確信しているので、詳細な説明を入力する必要はありません (必要な場合を除きます)。

4

6 に答える 6

83

最新のコンパイラを使用する場合のレジスタの使用法の良い例はありません(過去15年以上、この回答は2008年のものであることに注意してください)。registerを使用すると、コンパイラに「自分のコードを自分よりもうまく最適化する方法を知っている」と言っていることになりますが、これはほとんどありません。registerを使用すると、次の3つのいずれかが発生する可能性があります。

  • コンパイラはそれを無視します、これはおそらくそうです。この場合の唯一の害は、コード内の変数のアドレスを取得できないことです。
  • コンパイラは要求を尊重し、その結果、コードの実行速度が低下します。
  • コンパイラーは要求を尊重し、コードはより高速に実行されます。これは最も可能性の低いシナリオです。

registerを使用すると、あるコンパイラがより優れたコードを生成したとしても、別のコンパイラが同じことを行うと信じる理由はありません。コンパイラが十分に最適化していない重要なコードがある場合、最善の策はおそらくその部分にアセンブラを使用することですが、もちろん、生成されたコードが本当に最初に問題であることを確認するために適切なプロファイリングを行います。

于 2008-11-24T18:43:50.800 に答える
14

一般的に私はロバートに同意しますが、良いルールとしてこれにも例外があります。
深く組み込まれたシステムで作業している場合は、特定のハードウェアアーキテクチャで特定のアプリケーション用にコードを最適化する方法をコンパイラよりもよく知っているかもしれません。

しかし、99%の場合、Robertsの説明は埋め込み単語にも適しています。

于 2008-11-24T18:57:53.033 に答える
3

もう 1 つの一般的なケースは、低レベルのインタープリターを実装する場合です。いくつかの状態をレジスタに保持します。仮想マシン スタック ポインターを使用すると、メモリ アクセスを大幅に削減し、コードを高速化できます。

最適化の例については、vmgen — 効率的な仮想マシン インタープリターのジェネレーターを参照してください(5.2 Top of stack caching)。

于 2008-12-13T22:03:20.203 に答える
1

まず、レジスタ変数は、アクセス時間を最小限に抑えてパフォーマンスを向上させるために、ループ制御変数などの頻繁に使用される変数に使用する必要があります。二次的に使用できるのは、この状況でストレージ指定子を登録することだけです。たとえば、fun(auto int a、auto int b):error fun(register int a、register int b):rightこれだけが実行されますfun(static int a、 static int b):error fun(extern int a、extern int b):error

于 2013-01-05T12:26:55.480 に答える
0

これは複数のコーディング コンテキストがあるため、複数の回答が必要な質問です。C 言語はアセンブリ ルーチンを呼び出すことができるため、高レベル言語の観点からは、中間レベルと低レベル (アセンブリに至るまで) です。

C の代わりにアセンブリを使用する理由は、開発中に発生したパフォーマンスの問題のためです

于 2018-10-21T11:58:33.443 に答える