3

次のようにC#で配列を使用しています:

class abc 
{
    xyz x = new xyz(); // some other class
    public double [] arr = new double [100]; // Allocated 400 bytes 
                                             // for this array.
                                             // 100 is imaginary size 
                                             // shown here for simplicity.
                                             // Actual size will depend on input.
    private void something() 
    {
        x.funA(arr);
    }
}

上記のクラスabcでは、配列は 400 バイトを消費しています。今、私はクラスにあるパラメータとしていくつかの関数でこの配列を渡しましたxyz

私の質問は、新しい 400 バイトが class に割り当てられるかどうかxyzです。400 バイトはそれほど問題ではありませんが、私のプログラムでは、1 MB を使用する配列を渡しています。

4

2 に答える 2

2

参照を格納するために必要なメモリの量。私が覚えている限りでは、32 ビット マシンでは 8 バイト、64 ビット マシンでは 12 バイトです。

于 2012-07-11T05:46:53.230 に答える
1

参照型の場合、関数呼び出し中に参照自体のみがスタックにプッシュされます。値型の場合、値自体がスタックにプッシュされます。

objects/arrays/etc はすべて参照型です。つまりreference、オブジェクトへの のみが関数呼び出しのためにスタックにプッシュされます。実際のオブジェクト自体は、GC ヒープまたはプロセスが動的メモリを割り当てている場所に常駐します。参照のサイズはアーキテクチャに依存しますが、最近のほとんどのシステムでは 32 ~ 64 ビット (4 ~ 8 バイト) です。

値と参照の型について読みたいと思うかもしれません:

http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx

http://msdn.microsoft.com/en-us/library/490f96s2.aspx

これは、C# の単純さが直感に反する場合の 1 つです。C++ の観点から視覚化する方が簡単です。

double *data = new double[100]; //you can see here that "data" is merely a pointer to a double array with 100 elements, it doesn't actually hold the array itself.
somefunction(data); //now, it's more obvious what we're doing here: data is just a pointer, so all we're doing is passing a pointer to the function, not a double array.
于 2012-07-11T05:53:02.283 に答える