C#代码块中变量名称是否影响内存?内存异常问题咨询
C#中变量名称是否影响内存?
哈哈这个问题问得挺接地气的,先给你拍板:变量名称本身完全不会对内存产生任何影响——内存占用只看你实际分配的对象大小、对象的生命周期,以及系统的内存分配情况,和变量叫a还是xyz半毛钱关系都没有。
先解释你遇到的代码差异原因
咱们拆解下你的例子:
抛出异常的代码:
{ int[] a = new int[int.MaxValue / 8]; } { int[] a = new int[int.MaxValue / 8]; }每个
int[]数组的长度是int.MaxValue/8(约2.68亿个int),每个int占4字节,算上数组对象本身的开销,单个数组差不多要占1GB的连续内存空间。问题就出在「连续内存」上:.NET的数组是连续的内存块,即使你的系统总内存够2GB,也可能找不到两块连续的1GB空间,直接触发OutOfMemoryException。另外如果是Debug模式下,局部变量的生命周期会被延长到方法结束,两个数组会同时存在,进一步加剧了连续内存的分配压力。不抛出异常的代码:
{ int[] a = new int[int.MaxValue / 16]; } { int[] a = new int[int.MaxValue / 16]; } { int[] a = new int[int.MaxValue / 16]; } { int[] a = new int[int.MaxValue / 16]; }每个数组约512MB,总大小其实和第一段一样也是2GB,但因为是四个小的连续块,系统更容易找到零散的连续内存空间来分配,所以不会抛出异常。哪怕是Debug模式下总内存占用相同,小内存块的分配成功率远高于大内存块。
关于修改变量名称的影响
哪怕你把后面两个数组的变量名改成b、c,内存情况也不会有任何变化——变量名只是给程序员看的标识符,编译后会被转换成内存地址的引用,完全不会影响对象的分配、回收或者内存占用。
总结一下:内存问题的核心是连续内存块的大小和对象生命周期,和变量叫什么名字真的没关系~
内容的提问来源于stack exchange,提问作者Tomer Wolberg
相关产品推荐
相关产品推荐

