最近在学数据类型,关值类型和引用类型我是这样认为的,大家看看有没有什么问题 !
比如这样一个程序:
void Main (string[]ss)
{
int a=10;
char b='b';
int[] arr=new int[5];
}
像值类型 a b 在线程栈中 就分别分配一个 4个字节(32位)的内存地址给a , 然后分配一个字节的栈内存给 b。像引用类型的arr 在托管堆中, 分配一个5*4个字节的堆内存给arr, 然后再栈中存储这个5*4个字节的堆内存的引用 也就是地址不知道我上面说的2句话对不对? 如果都是对的,像int这样的值类型,栈给了他4个字节来保存,那引用类型的地址在栈中是用多大的空间来保存的呢?保存的是不是十六进制表示的内存地址?
比如这样一个程序:
void Main (string[]ss)
{
int a=10;
char b='b';
int[] arr=new int[5];
}
像值类型 a b 在线程栈中 就分别分配一个 4个字节(32位)的内存地址给a , 然后分配一个字节的栈内存给 b。像引用类型的arr 在托管堆中, 分配一个5*4个字节的堆内存给arr, 然后再栈中存储这个5*4个字节的堆内存的引用 也就是地址不知道我上面说的2句话对不对? 如果都是对的,像int这样的值类型,栈给了他4个字节来保存,那引用类型的地址在栈中是用多大的空间来保存的呢?保存的是不是十六进制表示的内存地址?
这里有2个。
arr 是一个对象的引用
new int[5] 是长度为5*4的数组
数组应该是在堆上,arr不知道,不确定。按理说引用类型都是放在堆上,当没有使用的时候,被垃圾回收。
{
Console.WriteLine(sizeof(int));
Console.WriteLine(sizeof(char));
Console.WriteLine(sizeof(byte));
}
输出 4 2 1
原来char是两个字节的。
引用类型的空间,用sizeof好像不行。用惯了c/c++感觉c#在这种地方很不方便,不过从另一个方面来说就是C#不必关心这种问题。
既然引用也是一种地址,那应该也是4字节吧,不过我不知道怎么验证。
//在堆中申请数组空间,在栈中申请引用变量arr的空间
arr在栈上
如果int占4 byte,那么 堆上还有 4*5 byte ,arr的值等于 4*5 这块内存的首地址编号
PS:以上套用C中的理解C#中不太关注变量内存占用情况不知对否 呵呵
应该是5*4的空间放在堆中,arr保存数组首地址。arr的数据存储是在栈中,数组对象是在堆中
我以前做的一张教学ppt