C# ローカル変数宣言 int number = 1;の内部構造

 

1. ソースコード上の宣言

int number = 1;
  • int は C# のエイリアスで実体は System.Int32(値型構造体)。
  • number はローカル変数(メソッド内と想定)。
  • 1 は 32 ビット符号付き整数リテラル。

2. コンパイル時 ― メタデータと IL 生成

メタデータ

テーブル役割
LocalVarSig変数名・型・スコープを格納
TypeRefSystem.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; は
    1. コンパイル時にローカルシグネチャと IL を生成し、
    2. JIT でネイティブ命令へ変換、
    3. 実行時はスタック上 4 byte の値型として扱われる。
  • 宣言場所や修飾子(static / const など)で初期化タイミングと IL の形が変わる点に注意。
訪問数 9 回, 今日の訪問数 1回

C#

Posted by hidepon