C/C++プログラム、標準ライブラリの使用メモリ領域の種類とセクションとの対応を表3.29に示します。
|
|
|
|
|
|
|
|
|
|
1
|
プログラム領域
|
P *1 *6
|
code
|
相対
|
有
不可
|
1byte *7
|
機械語を格納
|
2
|
定数領域
|
C *1 *2 *6 *8
|
romdata
|
相対
|
有
不可
|
4byte
|
const型のデータを格納
|
C_2 *1 *2 *6 *8
|
romdata
|
相対
|
有
不可
|
2byte
|
C_1 *1 *2 *6 *8
|
romdata
|
相対
|
有
不可
|
1byte
|
3
|
初期化データ領域
|
D *1 *2 *6 *8
|
romdata
|
相対
|
有
可
|
4byte
|
初期値のあるデータを格納
|
D_2 *1 *2 *6 *8
|
romdata
|
相対
|
有
可
|
2byte
|
D_1 *1 *2 *6 *8
|
romdata
|
相対
|
有
可
|
1byte
|
4
|
未初期化データ領域
|
B *1 *2 *6 *8
|
data
|
相対
|
無
可
|
4byte
|
初期値のないデータを格納
|
B_2 *1 *2 *6 *8
|
data
|
相対
|
無
可
|
2byte
|
B_1 *1 *2 *6 *8
|
data
|
相対
|
無
可
|
1byte
|
5
|
switch文分岐テーブル領域
|
W *1 *2
|
romdata
|
相対
|
有
不可
|
4byte
|
switch文の分岐テーブルを格納
|
W_2 *1 *2
|
romdata
|
相対
|
有
不可
|
2byte
|
W_1 *1 *2
|
romdata
|
相対
|
有
不可
|
1byte
|
6
|
C++初期処理/後処理データ領域
|
C$INIT
|
romdata
|
相対
|
有
不可
|
4byte
|
グローバルクラスオブジェクトに対して呼び出されるコンストラクタおよびデストラクタのアドレスを格納
|
7
|
C++仮想関数表領域
|
C$VTBL
|
romdata
|
相対
|
有
不可
|
4byte
|
クラス宣言中に仮想関数があるときに仮想関数をコールするためのデータを格納
|
8
|
ユーザスタック領域
|
SU
|
data
|
相対
|
無
可
|
4byte
|
プログラム実行に必要な領域
|
9
|
割り込みスタック領域
|
SI
|
data
|
相対
|
無
可
|
4byte
|
プログラム実行に必要な領域
|
10
|
ヒープ領域
|
―
|
―
|
相対
|
無
可
|
―
|
ライブラリ関数malloc、realloc、calloc、newで使用する領域 *9
|
11
|
絶対アドレス変数領域
|
$ADDR_
<section>_
<address> *3
|
data
|
絶対
|
有/無
可/不可
*4
|
―
|
#pragma address指定した変数を格納
|
12
|
可変ベクタ領域
|
C$VECT
C$VECT<ベクタテーブル番号>
|
romdata
|
相対
|
無
可
|
4byte
|
可変ベクタテーブル
|
13
|
リテラル領域
|
L *5
|
romdata
|
相対
|
有
可/不可
|
4byte
|
文字列リテラルおよび集成体の動的初期化で用いる初期化子を格納
|
注 1. | sectionオプションでセクション名を切り替えることができます。 |
注 2. | セクション名切り替えの際に、アライメント数が4のセクションを指定することで、アライメントが1または2のセクション名も変更されます。 |
注 3. | <section>はC,D,Bのセクション名称、<address>は絶対アドレス値(16進数)になります。 |
注 4. | 初期値、書き込み操作は<section>の属性に従います。 |
注 5. | sectionオプションでセクション名を変更することができます。このとき、変更後の名前にCセクションを選択することも可能です。 |
注 6. | #pragma sectionでセクション名を変更することができます。 |
注 7. | instalign4オプション、instalign8オプション、#pragma instalign4 または #pragma instalign8のいずれかを使用すると、アライメント数は4または8になります。 |
注 8. | #pragma endianでendianオプションと異なる指定のエンディアンを指定した場合、#pragma endian big であれば_Bを、#pragma endian little であれば_Lを、セクション名の後ろに付加した専用のセクションを生成し、該当データを格納します。 |
注 9. | これらの関数を使用するためには、最小で16バイトのヒープ領域が必要です。
|
例 1. | Cプログラムとコンパイラ生成セクションとの対応をプログラム例を用いて示します。 |
Cプログラム
int a=1;
char b;
const short c=0;
void main(){
...
}
|
|
|
プラグラム領域 (main(){...})
|
P
|
定数領域 (c)
|
C_2
|
初期化データ領域 (a)
|
D
|
未初期化データ領域 (b)
|
B_1
|
例 2. | C++プログラムとコンパイラ生成セクションとの対応をプログラム例を用いて示します。 |
C++プログラム
class A{
int m;
A(int p);
~A();
};
A a(1);
char b;
extern const char c='a';
short d=1;
void f(){...}
|
|
|
プログラム領域 (f(){...})
|
P
|
定数領域 (c)
|
C_1
|
初期化データ領域 (d)
|
D_2
|
未初期化データ領域 (a)
未初期化データ領域 (b)
|
B
B_1
|
初期処理/後処理データ領域 (&A::A, &A::~A)
|
C $INT
|