在.Net中,整数是值类型,这意味着它存储在堆栈中.
整数也是类(通常是system.int32).他们有像Compareto,Equals,……这样的方法,它们应该在堆栈上占用超过四个字节.
下面的例子显示它们只占用4个字节:
整数也是类(通常是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] 举报,一经查实,本站将立刻删除。