1

変数にすばやくアクセスするためにレジスタ ストレージ クラスが使用され、そのメモリは CPU に割り当てられます。ただし、CPU のレジスタは限られています。Intel Core i5-4260U プロセッサを使用しています。レジスターの詳細については、インテルの Web サイトにアクセスしました。しかし、CPUに含まれるレジスタの数に関するそのような仕様は見つかりませんでした(Webサイトにアクセスするには、ここをクリックしてください)。レジスタの数を見つけることができたとしても(( 8086/8088にはいくつのレジスタがありますか? ))、これらのうちのいくつがcストレージクラスで使用されているかわかりませんでした。

4

2 に答える 2

0

しかし、CPUに含まれるレジスタの数に関するそのような仕様は見つかりませんでした

「ia32 プログラミング モデル」または「amd64 プログラミング モデル」を探してください。

これらのうちのいくつが c ストレージ クラスで使用されているかわかりませんでした。

それは実装に依存します。コンパイラはそれを無視することさえできます。それらのいくつかは、変数が宣言されている方法に関係なく、高レベルの最適化で呼び出された場合、自動レジスタ マッピングを使用します。

例: IA32 のユーザー モード アプリケーションのプログラミング モデルは、レジスタEAXEBXECXEDXESIEDI、およびEBPで構成されます。およびアキュムレータとして使用され、一部の命令 ( 、) の暗黙のオペランドであり、関数の戻り値を保持します。スタックおよびフレーム管理用に予約されています。命令ポインタです。したがって、レジスタ マッピングには、、およびが残ります。生成されるコードによっては、これらのレジスタの 1 つまたは複数が必要になる場合があるため、変数のマッピングに使用できるレジスタの数がさらに減少します。ESPEIPEAXEDXMULDIVEBPESPEIPEBXECXEDIESI

于 2015-04-03T05:57:20.120 に答える
0

Cのregisterキーワードが含まれていたのは、C が作成されたとき、コンパイラが必ずしもレジスタ割り当てを適切に行っていなかったからです。レジスタ割り当ては、プログラム変数を CPU レジスタにマップするコンパイラの一部です。

現在、コンパイラがレジスタ割り当てに使用するアルゴリズムは全体的に優れています。コンパイラーはレジスターキーワードを無視することが多いため、パフォーマンスを最大化するためにレジスターをマップする方法についてプログラマーよりもコンパイラーの方がよく知っていると考えています。

コンパイラ 'mcleod_ideafix' がそれを書いたときに何を参照しているのかわかりEAXませEDXん。レジスタの割り当てには使用できません。gccコンパイラは、32 ビット x86 コード ( EAXEBXECXEDXESIおよび) で 6 つの整数レジスタを使用しEDIます。EBP関数が関数呼び出しを行わず、適切なコンパイラ オプションを指定した場合でも使用されます。R864 ビット モードでは、 を介してさらに 8 つのレジスタが追加されますR15gccを使用している場合は、オプションを指定してファイルをコンパイル-Sし、生成されたコードを見て、どのレジスタが使用されているかを確認してください。

考慮すべきもう 1 つのことは、Intel プロセッサはレジスタの名前変更と呼ばれる機能を使用して、十分なレジスタがない場合のパフォーマンスの低下を軽減することです。

于 2015-04-03T06:50:13.847 に答える