我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定)

假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内存的管理,进一步和一些改正的理解

原理两种:

一、笨办法

我们第一次用多少空间,开辟多少空间A

我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据复制到B中,然后释放A。在C中写入新的数据

缺点:在于拷贝的次数太多,效率低

二、改进的办法

矢量有一个參数,里面填写预留的空间,增加我们填写的预留空间大小是B,这里是预留B的地址,并没有真正的开辟物理内存,预留的作用于假设这时候假设须要开辟空间做其它事情,开辟的空间会避开B。这样不好造成在这里的数据变成不连续

然后开辟空间写入数据A(A所占内存小于4K,),vector中的realloc提交数据后操作系统管理内存的机制会映射一个“内存页”4K的空间给你来使用(假设数据A大于4k,开两页、三页……)。这时候物理内存和内存地址相应起来了,当在B中继续开辟空间填写数据D,这时候存入D的物理内存并非真正的开辟。而是接着使用刚刚开辟的“内存页”,仅仅有当4K空间用完,才会再次分配一个页使用

当写入的数据超过B,会将之前的全部数据提交。会又一次保留一块空间C(至少大于B)。将B中的数据拷贝入C中。释放B

长处:拷贝次数大大降低。效率提高

问:数组的线性地址和物理地址是否都必须连续

解:数组的地址肯定连续的,可是连续不过线性地址,也就是虚拟地址,或者说是地址编号,物理地址能够不是连续的

每一个进程都能够使用2G的内存,每一个进程都有一张页表,这里有一个寄存器CR3,来保存自己进程的页表,切换进程的时候CR3替换掉

(PanPen120原创 如有建议 请留言)

最新文章

  1. T-SQL 拆分使用指定分隔符的字符串(split string)
  2. 《Invert》开发日志04:工具、资源和服务
  3. HTML 字符实体
  4. webservice3
  5. python和php对比
  6. QML嵌入到QWidget中方法
  7. Android开发之IPC进程间通信-AIDL介绍及实例解析
  8. Constructing Roads
  9. [C++基础]关键词volatile
  10. ListControl一细节处理
  11. linux文件系统下的特殊权限
  12. [亲测有效] - Linux安装PostgreSQL
  13. CentOS7下解决ifconfig command not found的办法
  14. 前端开发笔记(2)css基础(上)
  15. json-server+mockjs 模拟REST接口
  16. android 8.0变更
  17. VS未能正确加载 ”Microsoft.VisualStudio.Editor.Implementation.EditorPackate“包错误解决方法
  18. 对集合应用符号 | & ^ -
  19. WindowsService服务安装脚本
  20. 【设计模式 7】从公司的目前框架和API Gateway,谈谈对外观模式的理解

热门文章

  1. SMTP邮件传输协议发送邮件和附件(转)
  2. javascript入门视频第一天 小案例制作 零基础开始学习javascript
  3. 批量的单向的ssh 认证
  4. Derby的下载安装和使用,(和JAVA中使用Derby)
  5. BZOJ 2073: [POI2004]PRZ( 状压dp )
  6. File 操纵目录
  7. 使用ant的war任务打包j2ee web项目
  8. JAVA中MESSAGEBOX,静态类直接引用
  9. Jquery moblie中的分栏布局
  10. Git命令非主流札记