C# ローカル変数宣言 int number = 1;の内部構造
目次
1. ソースコード上の宣言
int number = 1;
- int は C# のエイリアスで実体は System.Int32(値型構造体)。
- number はローカル変数(メソッド内と想定)。
- 1 は 32 ビット符号付き整数リテラル。
2. コンパイル時 ― メタデータと IL 生成
メタデータ
テーブル | 役割 |
---|---|
LocalVarSig | 変数名・型・スコープを格納 |
TypeRef | System.Int32 型参照を保持 |
IL(Debug ビルド例)
.method private hidebysig instance void Example() cil managed
{
.maxstack 1
.locals init ([0] int32 number) // LocalVarSig
IL_0000: nop
IL_0001: ldc.i4.1 // 定数 1 を積む
IL_0002: stloc.0 // スタック値 → number
IL_0003: ret
}
Release ビルドでは nop が省略される。
const int number = 1; にするとローカル変数は IL に現れず、呼び出し箇所に即値が埋め込まれる。
3. JIT 以降 ― 実行時の挙動
フェーズ | 内容 |
---|---|
JIT コンパイル | IL → ネイティブ(例: mov eax, 1) |
メモリ配置 | 変数はスタックフレーム上に 4 byte 確保。Little-Endian なら 01 00 00 00 |
GC との関係 | 値型なのでヒープを使わず GC 対象外(ボックス化時はヒープにコピー) |
4. フィールド宣言との比較
宣言形態 | IL 生成タイミング | メモリ配置 |
---|---|---|
インスタンス フィールドclass C { int n = 1; } | コンストラクタ (.ctor) | オブジェクトのヒープ領域内 4 byte |
static フィールドstatic int n = 1; | 静的コンストラクタ (.cctor) | 型の静的ヒープ領域 |
const フィールドconst int n = 1; | IL にローカルなし。即値埋め込み | 実行時メモリ確保なし |
5. まとめ
- int number = 1; は
- コンパイル時にローカルシグネチャと IL を生成し、
- JIT でネイティブ命令へ変換、
- 実行時はスタック上 4 byte の値型として扱われる。
- 宣言場所や修飾子(static / const など)で初期化タイミングと IL の形が変わる点に注意。
訪問数 9 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません