当我们将它传递给函数作为参数时,此数组将在C#中占用多少内存

时间:2012-07-11 05:41:40

标签: c#

我在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中。

我的问题是在类xyz中是否会分配新的400字节。 400字节并不是很重要,但在我的程序中,我传递的数据占用了一个MB。

2 个答案:

答案 0 :(得分:2)

存储引用所需的内存量。据我记忆,在32位机器上是8个字节,在64位机器上是12个字节。

答案 1 :(得分:1)

对于引用类型,在函数调用期间只将引用本身压入堆栈。对于值类型,值本身会被压入堆栈。

对象/数组/等都是引用类型,这意味着只有对象的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#在简单性方面略显反直觉的时代之一。从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.