微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

在.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会创建一个阴影引用类型来覆盖整数的盒装值,但这是另一回事.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐