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

假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有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原创 如有建议 请留言)

C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)的更多相关文章

  1. 动态库中的soname

    soname( Short for shared object name) 其是应用程序加载dll 时候,其寻找共享库用的文件名.其格式为 lib + math+.so + ( major versi ...

  2. Lib作为“静态库”与“动态库”中的区别

    Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...

  3. oracle 两个网络不通的远程数据库如何将一个库中的表数据导入到另一个库中?

      1.情景展示 本地可以直接连接2个不同的远程数据库: 两个数据库由于网络不通,无法建立DBLINK完成数据传输: 将A库中C表的数据插入到B库中C表,如何快速实现? 2.解决方案 通过kettle ...

  4. 【C】——动态库中函数的作用范围

    如何生成动态库 net小伙 已经在此文中说明——[C]——如何生成静态库和动态库:接下来就要看看动态库中函数的作用范围: 首先我们使用命令   gcc -fPIC -shared -o libtest ...

  5. Golang调用windows下的dll动态库中的函数

    Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...

  6. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

  7. 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

    新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene- ...

  8. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

  9. c++动态库中使用命名空间的问题

    这是C++才会有的语言特性. 假如你使用一个程序库,他里面有桓霰淞拷衋bc,可是你自己也不小心定义了一个叫abc的变量,这样就会引起重定义错误.所以为了避免这样的现象,C++引入了名字空间(names ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之0603打印素数

     题目

  2. java的new BufferedReader(new InputStreamReader(System.in))

    流 JAVA /IO 基本小结 通过一行常见的代码讨论:new BufferedReader(new InputStreamReader(System.in)) /*** *** 看到这篇文章挺好的, ...

  3. Linux下的在线播放神器

    Linux下的在线播放神器:一个是Amarok缺点是,每个音乐源都要更新后才能播放. 在一个就是中国造的:linux deepin下的深度音乐,缺点就是连不上.反正我是连不上

  4. Linux定义系统提示符的变量:PS1

  5. Sublime 脚本 配置 (lua 和 JavaScript篇)

    { "cmd" :["C:/Lua/Lua.exe","$file"], "file_regex" :"^(? ...

  6. linux定时调度器每秒运行一次

    linux操作系统最小粒度的定时调度器仅仅能调到分钟的级别,工作中有时需在到秒的调度,所以须要自己编写脚本来实现 #!/bin/bash while [ true ]; do /bin/sleep 1 ...

  7. 富文本编辑器 - wangEditor 表情

    效果: 文件夹中的表情: 代码:

  8. Eclipse使用技巧总结(三)

    十六.快速关闭窗口   关闭当前打开窗口 Ctrl + W       关闭当前打开的所有窗口 Ctrl +Shift +F4 十九.重命名  F2 二十.快速回到上次编辑点  Ctrl + Q 二十 ...

  9. java--实例成员 & 静态成员

    class run{ static String str1 = "静态变量"; String str2 = "非静态变量"; public static voi ...

  10. StrPos,StrScan,

    Delphi提供的字符串函数里有一个Pos函数,它的定义是: function Pos(Substr: string; S: string): Integer; 它的作用是在字符串S中查找字符串Sub ...