質問
私はこのようなものを持っている。
register unsigned int a, b, c;
int n;
for (n = 0; n < 10; ++n){
c = a + b
b = a
a = c
array[n] = c;
}
それが何、それは問題ではありません。コードはすぐregisterキーワードが削除された場合、それは、今遅い方法を実行します。私がint nの前にレジスタに追加するときしかし、それは実際にはレジスタが使用されていない場合よりも、今よりも遅いが、より速く実行されます。
誰かが私にこれを説明することはできますか?おかげます。
解決
register
は、コンパイラに代わりメモリ/スタック空間のレジスタに変数を配置するヒントを提供します。いくつかのケースでは、あなたはとても再びレジスタのうちの他の一部を強制することができますあまりにも多くの変数にそれを置くことで、このキーワードを置くすべての変数のための十分なレジスタは存在しません。
このは、しかし、ちょうどヒントで、コンパイラがそれを取る必要はありません。
他のヒント
どのように時間、このやりましたか?実際には、register
は、通常は何もしません。これは、コンパイラ技術は非常に原始的だったとコンパイラが自分自身をレジスタ割り当てを見つけ出すことができなかったときから嫌なものの作品です。これは、その変数にレジスタを割り当てるためのヒントになるはずと非常に頻繁に使用される変数のために有用でした。今日では、ほとんどのコンパイラは、単にそれを無視し、独自のアルゴリズムに従ってレジスタを割り当てます。
gccのでは、レジスタは間違いなく、無視されていません。 このようなもので、あなたのコードをテストする
unsigned int array[10];
int n;
#define REG register
int main()
{
REG unsigned int a, b, c;
for (n = 0; n < 10; ++n){
c = a + b;
b = a;
a = c;
array[n] = c;
}
}
は(REGが定義または空であるかどうかに応じて)取得
http://picasaweb.google.com/lh/photo/v2hBpl6D- soIdBXUOmAeMw?偉業= DirectLinkのの
左側にはレジスタを使用した結果を示している。
そのレジスタにすべてを入れていないだろうレジスタとして、すべてを記念して、使用可能なレジスタの数が限られています。ベンチマークは、役立つかどうかになるだろうかどうかを知るための唯一の方法です。あなたはレジスタのキーワードが役立つことを決める前に、良いコンパイラは変数が独自にレジスタに入れてかを把握することができるはずですので、あなたがすべきおそらくベンチマークもう少します。
レジスタを使用してのアイデアは、あなたの変数は非常に頻繁に使用されています。あなたの変数を持つすべての操作があれば、それはとにかくレジスタにコピーされます。だから、カウンタ(インデックス変数)は、この修飾子の候補です。
:1月15日1時57分で、'10からのディエゴ・トレス・ミラノの例では、私はこの方法でそれを作るだろうunsigned int array[10];
int main()
{
register int n;
unsigned int a = 1, b = 2, c;
for (n = 0; n < 10; ++n){
c = a + b;
b = a;
a = c;
array[n] = c;
}
}
割り当て可能なレジスタには限界があります。あなたはそれを出射した場合、あなただけの少ない効率的なコードで終わるます。
私のテイクは何を行うことは、あなたがレジスタに何が起こるのかを自分で決めなければならないほど重要であると何されない場合は、アセンブリ言語を使用してそれを書くべきであるということです。
汎用言語では、私は強く、コンパイラは、人間よりもレジスタに何が起こるのかを判断しやすくなりであると信じています。証明はあなたがレジスタに入れることができますどのように多くの変数がわからないながら、あなたのコンパイラは確かに知っているということで。