C言語registerキーワード-最も速いキーワード

3532 ワード

register:
このキーワード要求コンパイラは、メモリアドレッシングではなく、可能な限りCPU内部レジスタに変数を存在させ、効率を向上させる.注意はできるだけ、絶対ではありません.
register変数が多く定義されている場合、CPUのレジスタ数を超え、容量を超える可能性があるからです.だから可能だ.
#include 
using namespace std;
int f()
{
    register int i=0;
    for(int x=0;x<100000;x++)
        i++;
}
int f1()
{
    int i=0;
     for(int x=0;x<100000;x++)
        i++;
}
int main()
{
    f();
   f1();
}

しかしregister修飾子の使用にはいくつかの制限があります.
  1.register変数は、CPUに受け入れられるタイプでなければなりません.これは通常、register変数が単一の値でなければならないことを意味し、長さは整数の長さ以下であるべきである.ただし、一部のマシンのレジスタにも浮動小数点数を格納できるものがあります.    
  2.register変数はメモリに格納されない可能性があるため、register変数のアドレスは&で取得できません.レジスタの数が限られているため、また、一部のレジスタでは、特定のタイプのデータしか受け入れられません.ポインタや浮動小数点数など、実際に機能するregister修飾子の数やタイプは、プログラムを実行するマシンに依存します.余分なregister修飾子はコンパイラに無視されます.場合によっては、変数をレジスタに保存すると、プログラムの実行速度が低下します.占有されたレジスタは他の目的で使用できないため、または変化します.量は、変数の読み込みと格納に伴う追加のオーバーヘッドに十分ではありません.
  3.初期のCコンパイラは変数をレジスタに保存しません.命令しない限り、register修飾子はC言語の価値のある補充です.しかしながら、コンパイラ設計技術の進歩に伴い、それらの変数がレジスタに格納されるべきであることを決定する際に、現在のCコンパイラ環境はプログラマよりも良い決定を下すことができる.実際、多くのコンパイラはregister修飾子を無視します.それは完全に合法的ですが、コマンドではなく暗示にすぎません.
registerキーワードのc言語とc++の違い
c++で:
(1)registerキーワードはグローバルで変数を定義できません.そうしないと、不正なストレージクラスとしてプロンプトされます.
(2)registerキーワードがローカル役割ドメインで宣言された場合、&オペレータでアドレスを取ることができ、いったんアドレスを取るオペレータを使用すると、定義された変数がメモリに強制的に格納されます.
cでは、
(1)registerキーワードはグローバルに変数を定義でき、その変数に&オペレータを使用すると「悪いストレージクラスがある」と警告するだけです.
(2)registerキーワードはローカル役割ドメインで宣言できますが、&オペレータは使用できません.そうでなければコンパイルは通過しません.
グローバル変数のライフサイクルはプログラムの実行からプログラムの終了まで終了するため、registerキーワードでグローバル変数を定義しないことをお勧めします.register変数はcpuのレジスタに格納される可能性があります.プログラムのライフサイクル全体にレジスタが占有されている場合は、かなり悪い措置です.
CとC++がregisterキーワードを処理する違い2010年12月29日水曜日13:30 C++は完全にC言語に互換性があるわけではありません.今日、私は符号化時に何気なく違いを発見しました.registerキーワードで修飾された変数は、C言語では&オペレータでアドレスを取ることができません.これは私の経験です.コンパイラがプログラマの提案を受け入れて変数をレジスタに格納すると、仮想アドレスは存在しないからです.しかし、C++ではregisterで修飾された変数は&オペレータでアドレスを取ることができます.これは私がコードで発見したものです.プログラムにregister変数のアドレスが明示的に指定されている場合、コンパイラはレジスタ変数として定義されることなく、この変数をメモリに定義します.C 99(ISO/IEC 9899:1999)とISO C+(ISO/IEC 14882:2003)の規格で確認しましたが、CとC++の規格でregisterが遭遇&する処理には確かに異なる明確な定義があります.しかし、なぜこのように定義するのですか?私は規格の字から推測するしかありません.K&R C 1でregisterをどのように記述するかはまだ検証されていません.K&R C 2(ANSI C)で説明しました“register variables are to be placed in machine registers … but compilers are free to ignore the advice ”.しかし、C 99とISO C++では、それぞれ「suggests that access to the object be as fast as possible」、「a hint to the implementation that the object so declared will be heavily used」となり、「machine registers」は特に言及されなくなった.歴史的にregisterキーワードはできるだけ変数をレジスタに保存することを強調しているが、現在のregisterキーワードは具体的な手段を強調していない.コンパイラは、変数へのアクセスをさまざまな方法で最適化することを推奨します.(ただし、多くのコンパイラはこのキーワードを無視して独自の最適化戦略を採用している).C 99はK&R Cの互換性を保つためにアドレス操作を許さないのかもしれないが、C++は歴史的な負担がないからこの制限を緩和したのかもしれない.推測にすぎないが、内幕を知っている友人にもっと正確な答えを教えてほしい.