我们知道各种程序设计语言都会有一些基本类型!比如char, short ,int , float, double ,long 等。除了这些基本类型,还有会一些枚举,结构体,类等数据结构。这些数据在使用过程中,都会由操作系统(可以想像成计算机中的大管家!你写得程序不符合他的要求,他可是不给饭吃的呦!)或虚拟机(可以想像成计算机中的二管家,为人虽然随和但是并不总是什么都能说了算的---最终还得听大管家的!)把他们从硬盘等信息存储介质加载到内存中以方便程序运行时的使用。那么他们在内存中长什么样(用什么形态表示)?住几间房(占多大空间)?又是住在哪里(存储区域)?一环?二环?还是郊区(嘿嘿开个玩笑!---学习本来就可以是件快乐的事。让那些苦学的理论见鬼去吧!)?作为.net班的我们有福了,微软为我们提供了强大的IDE---Visual Studio系列,通过这个工具我们可以查看内存,查看反汇编代码,一切都清清楚楚,明明白白的展现在我们面前。而不用像java班的同学们一样,对一些概念性的东西只能靠猜,只能靠主观臆想。目前我还没有发现java哪款相关IDE可以查看内存的呢!如果有自然更好了!
好,就让我们开始惊心动魄的内存之旅吧!
船长:“收锚, 起航, 向内存海洋前进! 我们的第一站,基本数据类型港(听说比香港还香,嘎嘎^_^!!)”
船长:“马上就要到站了,大家准备好挖金子的锄头了没?老二,你用得vs2008, 看上去样子不是很花哨,但很实用,使用起来也很方便。老三,你呢, 哦2012也不错,据说还增加了一些新功能,不但可以挖宝,没事还可以用来掏掏耳屎,剪个指甲什么的! 老四你呢?什么??!!2010?赶快赶快把它换了,虽然这个工具也很优秀,但是她是不允许我们C#程序员探测内存金矿的(通过一些手段还是可以地---走后门走什么后门,呵呵看汇编去,不会?哦,那暂时还是算了换吧)?C,C++倒可以?为什么?别问我找比尔盖茨那小子去!”。
船长:“Nice! 既然各位都已经把工具准备好了?就让我教教你们怎么把工具中的内存金矿探测器(内存查看窗口)搞出来吧”
船长:“让我们按下神奇的按钮F10(单步步过---什么是单步步过, 在使用过程中你自然会了解到!)进入到调试状态!然后用鼠标点选 菜单-->调试-->窗口-->内存-->内存1(1) 当然内存2(2)等其它几个也是可以的;如果你想同时查看多个内存窗口的话这四个内存窗口是可以同时打开的”;
“调整好内存窗口在屏幕中的位置,一般是放在代码下边,内存窗口右边放置监视窗口。监视窗口的添加和内存窗口类似”
“内存窗口右上角有个设置显示列数的选项,我们一般选择16,why? 哈哈。因为内存中显示的数据都是以16进制表现的, 如果从0开始每行16列,那么第二行第一列的地址就会以0x00000010开头, 第三列0x00000020开头, 这样有利于我们对16进制有个整体的认识。 啥子是16进制呦?为什么要用16进制阿。 嗯,阿,说来话长。 计算机是什么?当然就是用来计算的机器。哦,他拿什么来计算,当然是数据了。数据写在哪里,当然是内存里了,在内存里是怎么表现的,当然是二进制了,咦?怎么又来了个二进制?不是16进制么?噢!结构决定性质这句话你听说过没?没?那好吧,三角形结构的物体有稳定性,不易变形对吧?人脑胜于猪胜对吧?为什么呢?肯定是构造不一样?结构不一样。要不猪猪和我们就没什么区别了。 就是因为计算机是用电驱动的。电有正负,有高压低压,用电得一种状态表示1另一种状态表示0, 许许多多个不同电的状态的组合就构成了许许多多个1和0的组合。再把这种组合按照一些预定好的计算公式(算法)转换成我们人类所需要的数据类型!比如说10进制的数。 而让一个适用于2进制构造的物体, 按照人类容易理解的10进制去设计的话会相当复杂,而且效率也不高, 所以2进制数据表示是最适合计算机的,这也是为什么计算机中表示小数会有一定的精度丢失,还是结构决定的,他最适宜表示整数,而用二进制表示小数要比整数麻烦得多。 也可以简单理解为因为人有10个手指,所以喜欢用10进制。 而计算机只有2根手指,所以喜欢2进制。 忽忽计算机好笨阿---你一定这么想。 计算机虽然很笨,但它很快,真是一快遮百丑! 亲这下明白了吧。那为什么内存窗口不用2进制来表示呢?因为2进制太长了(作为一个程序员的我,一直希望自己有个大屏幕最好42寸,爽阿!),又不易被人所理解。 而4个二进制位呢,正好可以转换成一个对应的16进制位 这样表示数据的长度一下就缩小到4分之一。无论从2转16还是从16转2都相当方便快捷。有关更多的2进制和16进制的讨论请参考相关书籍。这里不再赘述。”