11

私はこのようなものを持っています

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 の前にレジスタを追加すると、実際には現在よりも遅くなりますが、レジスタを使用しない場合よりは速くなります。

誰かが私にこれを説明できますか?ありがとう。

4

6 に答える 6

18

これはどうやってタイミングを計ったのですか?実際には、register通常は何もしません。これは、コンパイラ テクノロジが非常に原始的であり、コンパイラがレジスタの割り当てを自分で把握できなかった時代からのクラフトの一部です。その変数にレジスタを割り当てるヒントとなるはずで、頻繁に使用される変数に役立ちました。現在、ほとんどのコンパイラは単にそれを無視し、独自のアルゴリズムに従ってレジスタを割り当てています。

于 2010-01-15T00:59:03.430 に答える
13

register変数をメモリ/スタック空間ではなくレジスタに配置するヒントをコンパイラに提供します。場合によっては、このキーワードを配置するすべての変数に対して十分なレジスターがないため、あまりにも多くの変数に配置すると、他のいくつかの変数が再びレジスターから追い出される可能性があります。

ただし、これは単なるヒントであり、コンパイラはそれを受け入れる必要はありません。

于 2010-01-15T00:58:49.750 に答える
5

gccでは、最適化オプションを指定しない限り、registerは絶対に無視されません。このようなものでコードをテストする

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?feat=directlink

左側には、レジスタを使用した結果が示されています。

于 2010-01-15T01:57:38.170 に答える
1

There are a limited number of registers available, so marking everything as register won't put everything in registers. Benchmarking is the only way to know if it's going to help or not. A good compiler should be able to figure out what variables to put into registers on its own, so you should probably benchmark some more before you decide that the register keywords helps.

于 2010-01-15T01:01:31.327 に答える
-1

割り当て可能なレジスタには制限があります。それをやめると、効率の悪いコードになってしまうだけです。

私の見解では、何をレジスタに入れ、何を入れないかを自分で決めなければならないほど重要な場合は、アセンブリ言語を使用して記述する必要があります。

汎用言語の場合、コンパイラーは人間よりもレジスターに何が入るかをより適切に決定できると強く信じています。その証拠は、レジスターに入れることができる変数の数がわからない場合でも、コンパイラーは確実に知っているということです。

于 2010-01-15T01:22:24.053 に答える