CPUレジスタが制限されていて、その値がautoに格納されていると読んでいます。CPUレジスタに変数を格納する
変数がCのレジスタに格納されているかどうかを確認する方法はありますか?
どのような種類の変数を保存できますか?
CPUレジスタが制限されていて、その値がautoに格納されていると読んでいます。CPUレジスタに変数を格納する
変数がCのレジスタに格納されているかどうかを確認する方法はありますか?
どのような種類の変数を保存できますか?
ほとんどのコンパイラは、アセンブリ言語の出力を生成する-S
または/S
などのフラグをサポートしています。このコードを調べることで、コンパイラが与えられた変数を指定されたポイントのレジスタに格納するかどうかを調べることができます。
レジスタに収まることは保証されていません。実際、Andrew Tannenbaumの教科書にあるJVMのハードウェア実装を含むスタックベースのマシンでは、明示的なレジスタはまったくありません。しかし、int
は通常、レジスタと同じサイズです(下位互換性のために32ビットとしてint
とlong
を定義する64ビット環境)、ポインタは通常マシンアドレスを保持するため通常はレジスタと同じサイズです(アドレスが2つのレジスタに収まる16ビットx86などのセグメント化メモリモデルは例外です)、size_t
およびptrdiff_t
は配列インデックスを保持するため、通常はレジスタと同じサイズです(x32ターゲット、64ビットコード32ビットのメモリ空間は例外です)。ほとんどのCPUは浮動小数点レジスタを持っています。浮動小数点レジスタはそれぞれを保持して計算できますが、そうでないものもあります。
速いポータブルコードの場合は、とuint_fast32_t
などのタイプを<stdint.h>
から使用するのが最善の方法です。これらは、通常、少なくとも十分に広いサイズであることが保証されています。通常のターゲットでは、マシンレジスタのサイズになります。
'register'はコンパイラによって無視され、レジスタを割り当てる多くの最新のコンパイラによって行われます。今日、そのアドレスを取ることが許されないという副作用だけが、唯一の関連するユースケースです。残りの部分については、あなたの質問は広すぎます。 CPUがどのように動作するか、**特定の** CPUのリファレンスマニュアル、お使いのプラットフォームのABIを読んでください。 – Olaf