C ++でregisterキーワードに出くわしたばかりですが、これは(特定の変数をレジスターに保持する)良いアイデアのように思われるので、コンパイラーはデフォルトでこれを実行しますか?
それで、このキーワードはまだ使われているのだろうか?
C ++でregisterキーワードに出くわしたばかりですが、これは(特定の変数をレジスターに保持する)良いアイデアのように思われるので、コンパイラーはデフォルトでこれを実行しますか?
それで、このキーワードはまだ使われているのだろうか?
ほとんどの実装では、register
キーワードを無視します(構文上または意味上のエラーが発生しない限り)。
規格はまた、何もレジスターに保管しなければならないとは言っていません。変数が非常に頻繁に使用されることを実装へのヒントにしているだけです。その使用は非推奨です。
7.1.1ストレージクラス指定子[dcl.stc]
3)レジスタ指定子は、そのように宣言された変数が頻繁に使用されるという実装へのヒントです。[注:ヒントは無視できます。ほとんどの実装では、変数のアドレスが取得された場合、ヒントは無視されます。この使用は非推奨です(D.2を参照)。—エンドノート]
標準はこれを言います(7.1.1(2-3)):
レジスタ指定子は、ブロック(6.3)で宣言された変数の名前または関数パラメータ(8.4)にのみ適用されます。名前付き変数に自動保存期間(3.7.3)があることを指定します。ブロックスコープでstorage-class-specifierなしで宣言された変数、または関数パラメーターとして宣言された変数には、デフォルトで自動保存期間があります。
レジスタ指定子は、そのように宣言された変数が頻繁に使用されるという実装へのヒントです。[注:ヒントは無視できます。ほとんどの実装では、変数のアドレスが取得された場合、ヒントは無視されます。この使用は非推奨です(D.2を参照)。—エンドノート]
要約register
すると、役に立たず、痕跡的で、隔世遺伝的で、非推奨です。その主な目的は、自己登録クラスを実装しようとしていて、メイン関数に名前を付けたいと思っている人々の生活をより困難にすることです。register(T *)
おそらく、register
残っているキーワードのリモートで深刻な使用法は、インラインアセンブリなしでハードコードされたハードウェアレジスタを使用できるようにするGCC拡張機能だけです。
register int* foo asm("a5");
これは、へのアクセスがfoo
CPUレジスタに影響を与えることを意味しますa5
。
もちろん、この拡張機能は、非常に低レベルのコード以外ではほとんど使用されません。
C ++プログラムでは、特定の数のレジスタのみを使用できます。
また、これはコンパイラーへの単なる提案であり、ほとんどの場合、コンパイラーはこの最適化を自分で行うことができるため、キーワードを使用することはあまり使用されませんregister
。コンパイラーは提案に従う場合と従わない場合があります。
したがって、register
キーワードが最新のコンパイラで行う唯一のこと&
は、変数のアドレスを取得するために使用できないようにすることです。
キーワードを使用するregister
と、Cで変数のアドレスを取得できなくなりますが、C ++では、変数のアドレスを取得すると、コンパイラはregister
キーワードを無視します。
結論は、それを使用しないでください!
ハーブによってうまく説明されています:
そうではないキーワード(または、別の名前によるコメント)
いいえ、使用されていません。これは単なるヒントであり、非常に弱いものです。コンパイラにはレジスタアロケータがあり、どの変数をレジスタに保持する必要があるかを判断できます(そして、おそらく考えたことのないことを説明できます)。
キーワード「register」は、2011C++標準以降非推奨になりました。「registerキーワードの非推奨の使用を削除する」を参照してください。したがって、使用しないでください。
私自身の実験では、「register」キーワードを使用すると、gcc(v8.1.1)によって生成されるデバッグコードが異なることがわかりました。生成されたアセンブリコードは、指定された変数をレジスタに割り当てます。ベンチマークは、このコードが(「レジスター」のないコードよりも)高速に実行されることさえ示しました。ただし、リリース(最適化)コードでは違いが見られなかったため(つまり、「レジスタ」を使用しても効果がなかったため)、これは関係ありません。Vacbobはここで、最適化が有効になっている場合、gccは「登録」を無視すると述べています。私自身のテストはこれを確認します。
したがって、要約すると、「register」は使用しないでください。「register」を使用するとデバッグコードの実行速度が速くなるように見える場合は、最適化されたリリースコードでは実行されないことに注意してください。