0

私はC99を読んでいる外国人ですが、(6.7.1の)文は私を混乱させます:

  • '(ストレージクラス指定子レジスタを使用したオブジェクトの識別子の宣言は、オブジェクトへのアクセスが可能な限り高速であることを示しています。)このような提案が効果的である程度は、実装によって定義されます。'

2番目の文をどのように解析する必要がありますか:

  • そのような提案が効果的である程度は、実装によって定義されます。
  • そのような提案が効果的である程度は、実装によって定義されます。

どちらがいいですか?

それは、翻訳が終了した場合でも、実装がレジスターの処理方法を決定する完全な権限を持っていることを意味しますか?

ありがとう。

4

3 に答える 3

1

register変数をCPUのレジスタと混同しないでください。これらは同じではありません。

register最適化を可能にする目的があります。そのような変数のアドレスを取得することは禁止されており、その結果、そのような変数は決してエイリアスできず、コンパイラーは常に最新の値をマスターします。したがって、たとえばCPUレジスタやアセンブライミディエートなどの変数を簡単に実現できます。

特定のサブケースとして、プログラムによって直接変更することも、ポインターを介してアクセスする他のコードによって舞台裏で変更することもできないconst修飾変数があります。registerそのような変数だけが、プログラムの実行全体を通して一定であることが容易に保証されます。

于 2012-06-25T05:57:01.557 に答える
0

登録は古いキーワードです。基本的には、この変数を格納するためにレジスタを使用する方がよいことを伝えるオプティマイザへのヒントです。あなたが言及しているファスは、コンパイラがこのヒントを好きなように扱うことができることを意味します。コンパイラーを最適化する私たちの時代では、99%の意味と価値は何もありません。

于 2012-06-25T04:43:23.110 に答える
0

いいえ-提案が効果的である程度は実装によって定義されますが、コード全体の効果は定義されません。

別の言い方をすれば、コードに挿入した場合(許可されている場合)、コンパイラーはそれを完全に無視できます。そして、ほぼすべての合理的に最新のコンパイラーregisterそうすることを追加する義務があると感じています。

それでも、が存在するだけでregisterは、許可されていない場所(グローバル変数など)にコードを適用しようとしない限り、コードのコンパイルが妨げられることはありません。

結論:それを使用しないでください、しかしそれをすでに持っているコードからそれを削除することについて心配しないでください。時間と労力の無駄ですが、かなり現代的なコンパイラでは完全に無害です。

于 2012-06-25T04:45:29.867 に答える