内存如何保存不同数据类型的数据

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)

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

补充说明:

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

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

例二(char 类型)

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

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

ASCII码表

ASCII码表

例三(string类型)

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

  1. string类型的变量采用动态内存分配的方式来处理字符串数据
  2. 依次找到每个字符对应的ASCII码值(字符1-> 49、字符4-> 52、字符5-> 53、字符A-> 65、字符@-> 64)
  3. 将上述ASCII码值依次转化为二进制:49 -> 00110001、52 -> 00110100、53 -> 00110101、65 -> 01000001、64 -> 01000000
  4. 将上述二进制数放入刚刚申请的内存空间

补充说明:

  1. 为什么不同的编译平台(vscode、acwing)sizeof(str)的输出结果不同?
    在这里插入图片描述
    在这里插入图片描述
    ① 'std::string’类的实现:
            通常包含一个指向实际字符数据的指针、存储长度的信息和其他控制信息。在许多实现中, 'std::string’使用动态内存分配来存储其内容。这意味着字符串内容本身可能被存储在堆上,而不是对象本身(即 'std::string’对象)的内存中。
    ② 'sizeof( std::string)'的含义:
            sizeof(str) 返回的是 'std::string’对象的大小。这个大小包含指向实际字符数据的指针(通常8个字节)、长度信息和其他控制信息。
    ③ 'std::string’对象的大小取决于实现和编译器的优化
  1. 指针的概念:空间1里存放A的二进制编码,空间8里存放空间1的地址
  1. 动态申请内存概述
    内存操作
    申请内存时底层发生了什么

4. 推荐

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

  • 37
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值