__global_reg

__global_reg 記憶域クラス指定子では、宣言された変数がグローバル変数レジスタに割り当てられます。

Show/hide構文

__global_reg(n) type varName

各項目には以下の意味があります。

n

1 から 8 までの整数を指定します。

type

以下の型のいずれかを指定します。

  • long long を除く任意の整数型

  • 任意の char 型

  • 任意のポインタ型

varName

変数の名前を指定します。

Show/hide制約条件

この記憶域クラスを使用すると、externstatictypedef などの追加の記憶域クラスは使用できません。

C では、グローバルレジスタ変数を宣言時に修飾または初期化することはできません。C++ では、すべての初期化が動的な初期化として処理されます。

使用されている AAPCS のバリアントに応じて、使用できるレジスタ変数の数は異なりますが、グローバル変数レジスタとして 5 ~ 7 本のレジスタを使用できます。

実際には、以下の数を超える使用は推奨しません。

  • ARM または Thumb-2 の場合は 3 つのグローバルレジスタ変数

  • Thumb-1 の場合は 1 つのグローバルレジスタ変数

  • グローバル浮動小数点レジスタ変数として使用可能な浮動小数点レジスタの半数

多くのグローバル変数を宣言すると、コードサイズは著しく増大します。場合によっては、プログラムをコンパイルできなくなります。

Caution

グローバルレジスタ変数を使用する場合は、以下の理由で注意を払う必要があります。

  • 異なるコンパイルユニット間での直接呼び出しが適切であるかどうかがリンク時にチェックされません。プログラムで使用されているグローバルレジスタ変数は、できる限り、プログラムの各コンパイルユニットで定義して下さい。一般的に、レジスタ変数の定義はグローバルヘッダファイに配置するのが最も適切です。グローバルレジスタの値は、レジスタが使用される前に、コードの最初の段階で設定する必要があります。

  • グローバルレジスタ変数は呼び出し先退避レジスタにマッピングされるため、その値をグローバルレジスタ変数として使用しないライブラリ関数どのコンパイルユニットでは、この値が関数への呼び出しを介して保存および復元されます。

  • グローバルレジスタ変数を使用するコンパイルユニットへのコールバックは危険です。例えば、グローバルレジスタを使用する関数が、グローバレジスタ変数を宣言しないコンパイルユニットから呼び出されると、その関数は推測したグローバルレジスタ変数から誤った値を読み出すことなります。

  • この記憶域クラスは、ファイルの有効範囲のみで使用できます。

  • __global_reg 記憶域クラス指定子を使用した volatile 変数は、volatile として扱われません。

Show/hide

Example 5では、r5 に割り当てられたグローバル変数レジスタを宣言します。

Example 5. グローバル整数レジスタ変数の宣言

__global_reg(2) int x; v2 は r5 と同義

グローバルレジスタは、同じ変数のすべての宣言で指定する必要があるため、Example 6 ではエラーが発生します。

Example 6.  グローバルレジスタ - 宣言エラー

int x;
__global_reg(1) int x; // エラー

C で記述した __global_reg 変数は、定義時に初期化できません。Example 7 において、C++ ではエラーになりませんが、C ではエラーになります。

Example 7. グローバルレジスタ - 初期化エラー

__global_reg(1) int x=1; // C ではエラー、C++ では OK

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0491EJ
Non-ConfidentialID081711