ホームページ > バックエンド開発 > C++ > C# では、配列と値型はスタックとヒープにどのように割り当てられますか?

C# では、配列と値型はスタックとヒープにどのように割り当てられますか?

Linda Hamilton
リリース: 2024-12-29 09:18:11
オリジナル
361 人が閲覧しました

How are arrays and value types allocated on the stack and heap in C#?

スタックとヒープの配列割り当てと値の型

コード スニペット内:

int[] myIntegers;
myIntegers = new int[100];
ログイン後にコピー

new キーワードを使用して配列 myIntegers を作成すると、配列自体がヒープ上に割り当てられます。 CLR。ただし、値型である配列内の整数要素はボックス化されません。

スタック変数とローカル変数

関数内のすべてのローカル変数 (値型と値型を含む)参照型はスタック上に割り当てられます。 2 つの違いは、これらの変数に格納される内容にあります。

  • 値型は、実際の値を変数に直接格納します。
  • 参照型は、変数の値への参照を格納します。ヒープであり、変数自体にはこの参照のアドレスが含まれています。

RefType とValTypes

次の型を考えてみましょう:

class RefType {
    public int I;
    public string S;
    public long L;
}

struct ValType {
    public int I;
    public string S;
    public long L;
}
ログイン後にコピー

各型の値には 16 バイトのメモリが必要です: I に 4 バイト、S 参照に 4 バイト (または実際のValType の場合は S 文字列)、L の場合は 8 バイトです。

タイプ RefType のローカル変数がある場合、 ValType および int[] は、次のようにスタック上に割り当てられます:

Stack:

0-3 bytes: RefType variable
4-7 bytes: ValType variable
8-11 bytes: int[] variable
ログイン後にコピー

メモリ レイアウト

これらの変数に値を割り当てるとき:

refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;

valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;

intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;
ログイン後にコピー

値は次のように分布します。方法:

Stack:

0-3 bytes: Heap address of `refType`
4-7 bytes: Value of `valType.I`
8-11 bytes: Heap address of `valType.S`
12-15 bytes: Low 32-bits of `valType.L`
16-19 bytes: High 32-bits of `valType.L`
20-23 bytes: Heap address of `intArray`
ログイン後にコピー

ヒープ:

  • refType のヒープアドレス:

    • 0 ~ 3 バイト: refType.I の値
    • 4-7 バイト: のヒープ アドレスrefType.S
    • 8-11 バイト: refType.L
    • の下位 32 ビット: refType.L
  • の上位 32 ビット
  • intArray のヒープ上address:

    • 0-3 バイト: 配列の長さ (4)
    • 4-7 バイト: intArray[0] の値 (300)
    • 8 -11 バイト: intArray[1] の値 (301)
    • 12-15バイト: intArray[2] の値 (302)
    • 16-19 バイト: intArray[3] の値 (303)
**Passing Arrays**
ログイン後にコピー

以上がC# では、配列と値型はスタックとヒープにどのように割り当てられますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート