加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.Net / C#:整数的实际大小是多少?

发布时间:2020-12-15 20:04:17 所属栏目:百科 来源:网络整理
导读:在.Net中,整数是值类型,这意味着它存储在堆栈中. 整数也是类(通常是System.Int32).他们有像CompareTo,Equals,……这样的方法,它们应该在堆栈上占用超过四个字节. 下面的例子显示它们只占用4个字节: unsafe static void Main(){ int a = 2,b = 4; Console.Wr
在.Net中,整数是值类型,这意味着它存储在堆栈中.
整数也是类(通常是System.Int32).他们有像CompareTo,Equals,……这样的方法,它们应该在堆栈上占用超过四个字节.
下面的例子显示它们只占用4个字节:

unsafe static void Main()
{
    int a = 2,b = 4;
    Console.WriteLine("Adress of a : {0}",(int)&a);
    Console.WriteLine("Adress of b : {0}",(int)&b);
    Console.WriteLine("Size of integer: {0}",(int)(&a) - (int)(&b));
}

输出:

Adress of a : 1372876
Adress of b : 1372872
Size of integer: 4

CLR是否对整数和其他值类型(float,long,double,…)进行特殊处理?

解决方法

不,它们是值类型的事实并不意味着它们存储在堆栈中.这意味着他们存储了 wherever the variable lives.

但是,嘿,让我们与本地变量业务滚动,此时(没有捕获等)他们确实存在于堆栈中.它们需要4个字节.为什么他们需要更多?堆栈上不需要vtable,因为元数据已经指定了类型:没有关于将调用哪些虚拟方法的歧义等.

编辑:正如Shawn的评论中指出的那样(但我想让它更明显),System.Int32是一个结构,而不是一个类. (实际上CLR会创建一个阴影引用类型来覆盖整数的盒装值,但这是另一回事.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读