レジスタのデータの配置(32 ビットモード)
32ビットモードの場合、@演算子か#pragma locationディレクティブを使用して、グローバル変数や静的変数をレジスタに配置できます。
変数をレジスタに配置するには、@演算子および#pragma locationディレクティブの引数が、R4–R11範囲のArmコアレジスタに一致する識別子である必要があります(R9は‑‑rwpiコマンドラインオプションと組み合わせて指定することはできません)。
変数をレジスタに配置できるのは、変数が__no_initとして宣言され、ファイルスコープがあって、サイズが4バイトの場合のみです。レジスタに配置される変数は、メモリアドレスを持たないため。アドレス演算子&は使用できません。
変数がレジスタに配置されているモジュール内では、指定されたレジスタはその変数へのアクセスのみに使用されます。変数の値は他のモジュールへの関数呼出しで保持されます。その理由は、レジスタR4–R11が呼出し先で保存され、実行が返されるときに復元されるためです。ただし、レジスタに配置される変数の値は、常に予想通り保持されるとは限りません。
例外ハンドラやライブラリコールバックルーチン(
qsortに引き渡されたコンパレータ関数など)では、値が保持されないことがあります。コマンドラインオプション--lock_regsが、ライブラリモジュールも含むアプリケーションの全モジュール内のレジスタのロックに使用される場合、値は保持されます。高速割り込みハンドラでは、
R8–R11の変数の値は、ハンドラ外部からは保持されません。これらはバンクレジスタだからです。longjmp関数およびC++の例外によって、保持されない他の静的記憶寿命変数とは異なり、レジスタに配置された変数は古い値に復元されることがあります。
リンカは、モジュールが同じレジスタに異なる変数を配置するのを防止することはありません。異なるモジュールにある変数は同じレジスタ内に配置でき、別のモジュールはそのレジスタを他の目的で使用できます。
注記
レジスタに配置された変数は、インクルードファイルで定義され、その変数を使用するすべてのモジュールにインクルードされる必要があります。モジュール内の未使用の定義によって、そのモジュールでレジスタが使用されなくなります。