2

こんにちは、私はさまざまなドキュメントでこの種のものを読んでいます

register

宣言されている変数を CPU レジスタに格納するようにコンパイラに指示します。

標準 C 方言では、キーワード register は次の構文を使用します。

register data-definition;

型修飾子は、registerアクセスを最適化するために、(可能であれば) 宣言されている変数を CPU レジスタに格納するようにコンパイラに指示します。例えば、

register int i;

最適化がオンになっている場合、TIGCC は頻繁に使用される変数を CPU レジスタに自動的に保存しますが、キーワード レジスタは、最適化がオフになっていても強制的にレジスタに保存することに注意してください。ただし、レジスターにデータを保管する要求は、この場所で使用できる空きレジスターが十分にないとコンパイラーが判断した場合、拒否されることがあります。

http://tigcc.ticalc.org/doc/keywords.html#register

私のポイントは、登録についてだけではありません。私のポイントは、コンパイラが変数をメモリに格納する理由です。コンパイラの仕事は、単にコンパイルしてオブジェクト ファイルを生成することです。実行時に、実際のメモリ割り当てが発生します。なぜコンパイラがこのビジネスを行うのでしょうか。ファイル自体をコンパイルするだけでオブジェクトファイルを実行せずに、Cの場合にメモリ割り当てが発生するということですか?

4

3 に答える 3

6

コンパイラはマシン コードを生成し、そのマシン コードを使用してプログラムを実行します。コンパイラは生成するマシン コードを決定するため、実行時にどのような種類の割り当てを行うかを決定します。入力時にそれらを実行するのではなくgcc foo.c、後で実行可能ファイルを実行すると、GCC が生成したコードが実行されます。

これは、コンパイラが可能な限り最速のコードを生成することを望んでおり、コンパイル時にできる限り多くの決定を下すことを意味します。これには、物事の割り当て方法が含まれます。

于 2013-10-31T14:53:53.723 に答える