内存如何保存差别数据范例的数据

铁佛  金牌会员 | 2024-7-12 13:44:32 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

1. 了解

   ① 我们通常说的内存指的是运行内存(后台和前台能同时运行多少APP)。运行内存一旦满了,就不可以再打开新的APP了,除非开释掉一部门内存(关掉一些app)
② RAM(随机存取存储器,Random Access Memory)就是内存条。RAM越大越好。电脑的内存条就是用来管内存条的。补充:RAM是盘算机存储器(Computer memory)的一种
③ 任务管理器显示的内存(Memory)现实上指的是内存占用

④ 存储器以二进制盘算容量,根本单位是Byte(字节):

(图片来源:百度百科)
⑤ 手机:12G+256G。12G:运行内存。256:存储空间(可以明白为电脑上的硬盘容量)
有的手机显示的是 12+8G(最大支持动态扩展8GB运行内存,会占用部门存储空间),256G。
  2. 内存

   可以把内存想象成一张有界限的特殊大的网大概医院住院部的某栋楼。内存容量是有限的。

如果现在是一位病人一个病房:
① 内存容量有限:住院部病房数目有限
② 数据存储时以字节为根本单位:病房办理入住时,一个病人一个病人地办理(以单个病人为单位办理入住)
③ 存储器以二进制盘算容量,根本单位是Byte(1B=8bit),内存中每个格子里有8个由0、1组成的二进制代码串:一个人由头、脚等8部门组成
④ 开发的内存空间必须是一连的:有几个病人要求他们的病房必须挨在一起
  ① 盘算机为什么以二进制数(0和1)体现数据

           0和1代表两种对立的状态。例如:灯泡有亮和不亮两种状态。按一下开关,灯泡亮了,我们把亮这个状态记为1;再按一下,灯泡就灭了,我们就把不亮的状态记为0。这里的开关灯泡就可以明白为一个简朴的程序。
        一些大型程序其实也是由无数“开关"组成。例如:现在有100个人按10×10的矩阵分列,每人手里拿一个大灯泡。此时就可以通过控制每个人手中灯泡的状态(亮还是不亮),来实现用摆字的结果。如果指挥员说:第三排第三列的同砚,请让你的灯亮起来。因为现在灯泡只有亮和不亮两种状态(不考虑灯泡可以调色的情况),所以这位同砚很快就可以知道自己应该怎么做。
        因为机器明白本事有限,为了便于机器快速明白,所以就接纳0、1体现数据。因为盘算机只能明白0和1,所以工程机械学开始推广的时候,会把控制一些东西的定义为0和1。
  ② 为什么一个字节是8位

   盘算机中,为什么一个字节是8位
  ③ 一个字节可以体现多少个数据值

   2的8次方
如果现在有3个灯泡,每个灯泡有两种状态0和1,3个灯泡共能出现多少状态:000、100、010、001、110、101、011、111即2的3次方种状态。现在有8个灯泡,能出现多少种状态?2的8次方
  3. 内存如何保存差别的数据范例

   步骤一:依据变量范例开发内存空间(一定要是一连的空间,英文:back to back)。通常情况下int范例变量占4个字节、char占1个字节…

简朴明白为:通常情况下int范例变量占4个格子,char范例变量占一个格子

申请完内存以后,这里显示的内存占用就会随之增加。
    步骤二:将数据转化为二进制并存入内存空间
  例一(int 范例)

   int ingeter;
cin >> ingeter;
(从控制台输入32)

  

  • 通常情况下在内存中申请4个一连的空间(1个4bytes的空间)
  • 将32转化为二进制数 00100000
  • 由于int范例变量通常占4个字节,而00100000只占一个字节,所以需要补齐成00000000 00000000 00000000 00100000
  • 上述二进制数放入刚刚申请的内存空间
  补充说明:

   int ingeter;
while(1){
      cin >> ingeter;
}
(从控制台依次输入32,24)

        在这种情况下,系统会直接将新数据(24)写入变量ingeter所在的内存空间,覆盖掉之前的数据(32),旧的数据(32)不再保存。
        覆盖操纵并不需要显式地“整理”或“丢弃”旧数据,因为新数据写入时,旧数据天然被覆盖。在操纵系统和编译器的实现中,当程序运行到变量赋值的那一行代码时,新的值会直接写入到变量所指向的内存地址,旧的数据将不再被访问到。
  例二(char 范例)

   char character;
cin >> character;
(从控制台输入A)

  

  • 在内存中申请一个空间(1个1byte的空间)
  • 找到A的ASCII码值(65)
  • 将65转化为二进制数0100 0001
  • 将上述二进制数放入刚刚申请的内存空间
  ASCII码表

   ASCII码表
  例三(string范例)

   string str;
cin >> str;
(从控制台输入145A@)

  

  • string范例的变量接纳动态内存分配的方式来处置惩罚字符串数据
  • 依次找到每个字符对应的ASCII码值(字符1-> 49、字符4-> 52、字符5-> 53、字符A-> 65、字符@-> 64)
  • 将上述ASCII码值依次转化为二进制:49 -> 00110001、52 -> 00110100、53 -> 00110101、65 -> 01000001、64 -> 01000000
  • 将上述二进制数放入刚刚申请的内存空间
  补充说明:

   

  • 为什么差别的编译平台(vscode、acwing)sizeof(str)的输出结果差别?


    ① 'std::string’类的实现:
            通常包含一个指向现实字符数据的指针、存储长度的信息和其他控制信息。在许多实现中, 'std::string’使用动态内存分配来存储其内容。这意味着字符串内容本身大概被存储在堆上,而不是对象本身(即 'std::string’对象)的内存中。
    ② 'sizeof( std::string)'的含义:
            sizeof(str) 返回的是 'std::string’对象的巨细。这个巨细包含指向现实字符数据的指针(通常8个字节)、长度信息和其他控制信息。
    ③ 'std::string’对象的巨细取决于实现和编译器的优化
   

  • 指针的概念:空间1里存放A的二进制编码,空间8里存放空间1的地址
   

  • 动态申请内存概述
    内存操纵
    申请内存时底层发生了什么
  4. 保举

   内容来源:
int范例字节占用原理
直面数据结构

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表