修行之路开始——对内存的理解

首先:需要思考下面这句话:

int  a = 10;

这简单的一句话都包含了什么?

1.变量名   

实际上就是这个意思,编译器在编译的时候把他放到了符号表(下面又说符号表)里,然后在需要操作它的时候,会去符号表中找到一个叫a的地址,可以理解为是字典类型的,一个键对应一个Value,这个键就是变量名,值就是变量的地址。然后再去访问对应地址中的东西。指针变量也一样,只是多一步寻址。

2.信息将要存储在哪里

就是地址啦

3.要存储何种类型的值

也就是在内存中占几个字节

4.要存储什么值

也就是说占的那几个字节怎么表示出这个值来

需要知道的知识:

8Bit=1byte。

32位操作系统寻址范围:2^32 = 4294967296 Byte = 4194304 KB = 4096 MB = 4GB

64位操作系统寻址范围:2^64=18446744073709551616 Byte=18014398509481984 KB=17592186044416 MB=17179869184 GB

寻址空间,每个CPU都有自己对内存寻址能力,通俗地说,就是能最多用到多少内存的一个问题。数据在存储器(RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据在那里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位。 通常人们认为,内存容量越大,处理数据的能力也就越强,但内存容量不可能无限的大,它要受到系统结构、硬件设计、制造成本等多方面因素的制约,一个最直接的因素取决于系统的地址总线的地址寄存器的宽度(位数)。 计算机的寻找范围由总线宽度(处理器的地址总线的位数)决定的,也可以理解为cpu寄存器位数,这二者一般是匹配的。

所以,我们可以把内存当作一个仓库,把CPU当作一个库房管理员。

仓库里最小的存储单位是1Bit,即一个格子,而八个格子组成了一个架子,即1Byte。

不同的库房管理员的体力能力不同,相同的对库房的管理能力也就不同,有的能看管1000Byte的库房,有的能看管100000Byte的库房,你让能看管100000Byte的库房管理员去看官1000Byte的库房大材小用,反过来就是资源浪费。

然后呢库房的每个格子都有自己的一个十六进制编号,为什么用16进制?因为太长了嘛。

然后那些数据也就存在这些地址里了,一个int类型的变量,就占四个格子,所以说CPU那边有了这个int类型的变量的地址就直接能找到对应的格子,然后操作里面的数据啦。即*p=你想要的任何数字。

另外还需要知道的计算机组成原理和编译原理的一些知识。

 在编译程序中,符号表是用来存放源程序中出现的有关名字的属性信息,这些信息集中反映了名字的语义特征属性。符号表在编译全过程的地位和作用非常重要,是进行上下文合法性检查和语义处理及代码生成的依据。符号表总体结构的设计和实现是与源语言的复杂性(包括词法结构、语法结构的复杂性)有关,还与对于编译系统在时间效率和空间效率方面的要求有关。为此在本章中应对以下几个重点、难点问题作认真的学习,并切实掌握其中的内容。

    也就是说你在写程序的时候,定义的变量名是给咱们程序员自己看的,编译器根据变量的修饰词比如static或者什么const啊或者什么局部变量啊再或者什么咱们自己的定义的类啊实例化出来的变量,依次放入内存划分的那几大区,所谓的变量名在内存中根本不存在,操作时转换成地址数存放在寄存器中了。其实可以理解为是符号表起到了连接作用,这个变量名其实就是一个标识符,用来指代一块内存区域,即所谓的变量,使用变量使我们操作内存以区域,而在你的机器代码中,是不会出现变量名的,变量名是给我们程序员操作内存来使用的。听说在汇编年代,没有变量名,那时候程序员操作内存,都是用地址来直接操作的,还要控制区域大小。

同理,指针变量这个东西也是一个变量名,就是说这样嘛:int*p;这个东西你在64位操作系统里用sizeof可以看到是8,也就是说,一个指针变量的大小是8个字节,这个指针变量里面存着它所想让CPU去寻找的真正地址,比如你用*p的时候嘛,这个过程就是说CPU通过符号表的地址找到了这个指针变量,然后再根据它这个里面存的地址找到对应的那个地址,然后再根据这是个什么类型的变量,比如是int类型的,就在找到的那个地址的基础上数1,2,3,4个字节,这个东西,就是我们的int型变量。

而且我们知道C#或者C++引用类型的变量除了他实际指向的堆中那一坨,它本身也是个变量,就是个指针嘛,而且他和指针变量占的内存也是一样大的,也是8个字节。只不过这个引用类型的变量当实例化一个引用类型的变量,也就是new一个对象时侯,会返回一个对象实例的真实地址付给引用类型的变量,然后我们操作这个引用类型 变量加加减减的时候,就和操作指针的过程一样了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值