2009-04-02 11 views
2

多くの再帰を伴うC++コードがあります。私は自分の変数にレジスタクラスを使うことを考えています。あなたは私がスタックメモリを節約され、パフォーマンスが向上しますそうすることによって思いますレジスタ変数

サミール

答えて

8

私は、コンパイラがあなたの要求を尊重するつもりはないと確信しています。あなたはローカル変数を持っており、その関数を再帰的に100回呼び出すとします。すべてのあなたの自動変数の 'register'キーワードを守るためには、その変数のためだけに100のハードウェアレジスタが必要です(すべての変数は100番目の呼び出しで生きています)。

パフォーマンスは難しい問題です。プログラムが本当に時間を費やしてどこを最適化しようとしているのかを分析しますが、慎重にしてください。前にも言及したように、コンパイラは実際に自分たちがしていることをよくしています。変数をレジスタに強制するということは、残りの変数を使用するレジスタを1つ少なくすることを意味します。

6

おかげでいいえ、私はそれはおそらく全く効果がないと思います。現代のコンパイラは通常、人よりもレジスタの使用をスケジューリングする方がはるかに優れており、おそらく "register"キーワードは無視されます。

これまでのところ、コードを書き、そのキーワードを使ってパフォーマンスを測定するだけで、コードの変更は簡単です。

1

std::stackと、関数スタックと再帰呼び出しの代わりにアルゴリズムの状態を含むカスタムクラスを使用するようにアルゴリズムを変更することができます。

+0

これでパフォーマンスは向上しませんが、スタックオーバーフローの問題は明らかに軽減されます。 –

1

私が正しく覚えていれば、registerキーワードは変数がレジスタに格納されることを保証するものではありませんが、可能であればレジスタを使用する必要があることを示します。ただし、レジスタが使用できない場合は、積み重ねられます。

Microsoft C++はキーワードを無視して、独自の判断を下します。私は最初にあなたのアルゴリズムにパフォーマンスの向上を見てみましょう。

0

お客様のregisterリクエストを尊重することは、コンパイラまで100%です。確かに、ローカル変数を1つまたは2つのレジスタに絞り込むことができればスタックスペースを節約することができますが、それらの値をコール全体で保持する必要がある場合は、スタックに再度配置する必要があります(もちろん)。

+0

コンパイラがレジスタ変数の要求を受け入れたかどうかを調べる方法はありますか? –

+0

@sameer:アセンブリを分析しますが、メソッドが複雑な場合はそれほど簡単な作業ではありません –

関連する問題