打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#的引用类型在内存到底是怎么分配的
先说C++
C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void main()
{
int a = 5;
int* b = new int(6);
int c = 7;
double* d = new double(8.0);
double e = 9.0;
cout << "a的地址:\t" << &a << endl;
cout << "b的地址:\t" << &b << endl;
cout << "b指向的堆地址:\t" << b << endl;
cout << "c的地址:\t" << &c << endl;
cout << "d的地址:\t" << &d << endl;
cout << "d指向的堆地址:\t" << d << endl;
cout << "e的地址:\t" << &e << endl;
}
输出如下:
C/C++ code
1
2
3
4
5
6
7
a的地址:        0018FF44
b的地址:        0018FF40
b指向的堆地址:  00481CE0
c的地址:        0018FF3C
d的地址:        0018FF38
d指向的堆地址:  00481CA0
e的地址:        0018FF30
对于指针变量在栈中分配4个字节,让实际值存放在堆中,通过指针变量对堆中内容进行操作.
再说C#
C#有值类型和引用类型,数据在内存中的分配位置,取决于变量的数据类型,值类型分配在线程栈上,引用类型分配在托管堆上.
先上CLR via C#上面的内容
C# code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SomeRef { public Int32 x; }
struct SomeVal { public Int32 x; }
static void ValueTypeDemo()
{
SomeRef r1 = new SomeRef();
SomeVal v1 = new SomeVal();
r1.x = 5;
v1.x = 5;
Console.WriteLine(r1.x);
Console.WriteLine(v1.x);
.........
}
内存分配如下:
如<<你必须知道的.Net>>http://www.cnblogs.com/anytao/archive/2007/05/23/must_net_08.html内存分配也是这样
我的测试代码如下:
C# code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Program
{
static void Main()
{
int x = 0;
int y = 1;
MyClass c = new MyClass();
int z = 3;
unsafe
{
Console.WriteLine((int)&x);
Console.WriteLine((int)&y);
Console.WriteLine((int)&z);
}
Console.Read();
}
}
输出如下:
C# code
1
2
3
1699840
1699836
1699832
那照教程上说new操作符会返回对象的内存地址,该地址保存在变量c中(c在线程栈中);那真这样,z的地址为什么是1699832,跟y刚好相差4字节,那c到底存没存在栈上,如果存栈上面,它不占空间吗?
C#引用类型内存分配情况到底怎么样,大多教程都是这么说的,自己证实起来又感觉不像书上说的那样,是我没理解清楚??我感觉他没有C++那样讲得清晰易懂.
请清楚的分享下.
更多 分享到:
相关知识库:直播技术敏捷Go机器学习
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++和C#中的值传递和引用传递
关于常量折叠
淘宝招聘笔试经验及讲解
C++中int *p[4]和 int (*q)[4]的区别
有关(int&)和(int)的区别
this指针基础介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服