路人C学习笔记揭秘内存2

关于上文中遗留的两个问题,首先关于内存对齐。

为什么需要进行内存对齐呢?接触过单片机知道,单片机属于8位机,所以每次读写数据都是以8bit来进行的,所以在内部存储器和外部的存储器都是以字节为单位来寻址的。回到我们PC中,物理层面上每个地址也是对应着8bit数据的,也就是一个字节。但对于操作系统来说就有些不一样了,而且我们PC中包含的存储单元数量远远大于单片机系统中所使用的,所以如果每次访问变量时可从任何地址开始,变量排列只是按照单纯的顺序规则排列那对CPU来说效率是相当低的。所以我们需要对各种类型的变量按照一定的空间规则排列,用来提高我们的效率。

举个例子,在一个32位系统中,每次读取数据都是从偶地址开始读取。先定义一个字节型,再定义一个int型,如果按照顺序排列,那当读取int型时,则需要读两次以后,再将数据拼凑才行。而,如果是按照4字节对齐,那读取int型数据也就只需要1次就可以了,效率上提高了很多。

对于具体的操作系统的具体对齐规则我们不一定要完全了解,只需记得,在内存中,各类型的变量并不是单纯的顺序排列的,而是需要对齐处理的。

那我们再看看上一文中的第二个问题,我们输出s5这个字符串时显示的是“烫烫烫烫烫Hello”,这里面的“Hello”显然是我们s4中定义的那个“Hello”吗?两者是怎样的关系?

按我们常理来说,我们先定义了s4,随后再定义了s5,s4应该在s5存放之前才对。因为s5在定义时没有在尾部加‘\0’,所以如果输出字符串格式则会知道遇到‘\0’时才停止。那又怎么会跑到前面s4那里去呢?难道那个Hello不是s4中的?错,它就是s4中的,这个我们可以实验验证,修改s4内容,看看s5的输出是否也同样修改。那这到底是怎么回事?

完整精彩全文请看原文链接。









































优秀裁判文书杨汉卿北京新范文化有限
优秀裁判文书杨汉卿北京新范文化有限



转载请注明:http://www.nydjfy.com/jbjj/1430.html

  • 上一篇文章:
  •   
  • 下一篇文章: