我在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。
答案 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.