当前位置: 首页 > article >正文

C++--------内存结构

  1. C++内存结构

    • 程序内存分区
      • 栈区(Stack):由编译器自动分配和释放,用于存放函数的参数值、局部变量等。其操作方式类似于数据结构中的栈,先进后出。例如,在函数调用时,函数内部的局部变量会被压入栈中,函数执行完毕后,这些变量会按照相反的顺序出栈释放。
      • 堆区(Heap):这部分内存需要程序员手动分配和释放,通过mallocnew等函数来分配空间,使用freedelete等函数来释放空间。比如,当需要动态分配一个数组来存储不确定数量的数据时,就会在堆区进行操作。
      • 全局/静态存储区(Global/Static):存放全局变量和静态变量。全局变量在整个程序生命周期内都存在,静态变量根据其定义(如函数内的静态变量)在相应的作用域内一直存在。
      • 常量存储区(Constant):用于存放常量字符串等不可修改的数据。例如,const char* str = "Hello";中的"Hello"就存储在常量存储区。
    • 内存地址和指针:内存中的每个字节都有一个唯一的地址,在C++中可以通过指针来访问这些地址。指针是一个变量,它存储了另一个变量的内存地址。例如,int* ptr;声明了一个可以指向int类型变量的指针,ptr = &var;var的地址赋给ptr,然后可以通过*ptr来访问var所存储的值。
  2. 位、字节和字

    • 位(Bit):是计算机存储信息的最小单位,只有0和1两种状态。它用于表示二进制数中的一位。
    • 字节(Byte):通常由8个位组成,是计算机中常用的基本存储单位。可以表示一个字符(ASCII码)或者一个小范围的整数(0 - 255)等。例如,一个字节可以存储'A'(ASCII码值为65)这个字符。
    • 字(Word):字的长度因计算机体系结构而异,在16位计算机中,一个字是16位(2个字节);在32位计算机中,一个字是32位(4个字节);在64位计算机中,一个字是64位(8个字节)。它是CPU一次能处理的数据长度,用于提高数据处理效率。
  3. 二进制和十六进制的表现

    • 二进制:以2为基数的计数系统,只有0和1两个数字。在C++中,二进制数可以用于位运算等操作。例如,int num = 0b1010;(C++ 14及以上支持这种二进制字面量的表示方法)定义了一个二进制数1010对应的十进制数为10的变量。
    • 十六进制:以16为基数的计数系统,数字包括0 - 9和A - F(或a - f)。十六进制常用于表示内存地址或者二进制数据的紧凑形式,因为每一位十六进制数可以表示4位二进制数。例如,0xFF表示二进制的11111111,十进制的255。在C++中,可以用0x前缀来表示十六进制数,如int color = 0x00FF00;可能用于表示颜色值。
  4. 表示其他数据类型

    • 整数类型:C++有多种整数类型,如char(通常1个字节)、short(通常2个字节)、int(通常4个字节)、long(在32位系统中通常4个字节,64位系统中通常8个字节)和long long(通常8个字节)。这些类型可以表示不同范围的整数,并且可以用不同的进制来初始化,如int decimal = 10;(十进制)、int octal = 012;(八进制,以0开头)、int hexadecimal = 0xA;(十六进制,以0x开头)。
    • 浮点数类型:包括float(单精度浮点数,通常4个字节)和double(双精度浮点数,通常8个字节)。浮点数用于表示带有小数部分的数值,它们在内存中的存储格式遵循IEEE 754标准,以科学计数法的形式存储。例如,float num = 3.14f;(注意f后缀用于表示单精度浮点数)。
    • 字符类型和字符串类型char类型用于表示单个字符,如char ch = 'A';,而字符串可以用字符数组(如char str[] = "Hello";)或者string类(#include <string>,如std::string str = "World";)来表示。字符在内存中以ASCII码(或其他字符编码)的形式存储。
  5. 为变量分配内存

    • 自动分配(栈区):对于局部变量,当程序执行进入变量的作用域时,编译器会自动在栈区为其分配内存。例如,在函数void func() { int num = 5; }中,num是一个局部变量,当func函数被调用时,在栈区为num分配4个字节(假设int为4个字节)的内存空间来存储其值。
    • 动态分配(堆区):使用new关键字(C++)可以在堆区为变量分配内存。例如,int* ptr = new int;在堆区分配了一个int类型大小的内存空间,并将其地址存储在ptr指针中。对于数组,可以使用int* arr = new int[10];来分配一个包含10个int元素的数组。需要注意的是,使用new分配的内存必须使用delete(对于单个变量)或delete[](对于数组)来释放,以避免内存泄漏。
    • 在这里插入图片描述

http://www.kler.cn/a/458530.html

相关文章:

  • 【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)
  • 【数字化】华为一体四面细化架构蓝图
  • [JAVA]MyLogger
  • 【蓝桥杯选拔赛真题87】python输出字符串 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • 41.3 将重查询记录增量更新到consul和redis中
  • 5分钟掌握python中的匿名函数
  • git设置项目远程仓库指向github的一个仓库
  • 将时间戳转换成年月日时分秒的字符串(ubuntu20.04,C++)
  • 《Vue3 二》Vue 的模板语法
  • 低代码开发中 DDD 领域驱动的页面权限控制
  • Excel for Finance 05 数据类型:股票 (Stocks)
  • b站ip属地评论和主页不一样怎么回事
  • springboot 上传图片 转存成webp
  • 3.在Vue 3中使用Echarts实现水球效果
  • linux安装nginxs报错:openssl not found
  • 20241227在ubuntu20.04.6系统中,如何用watch命令每秒钟调用nvidia-smi来监控GPU
  • 【Spring】基于XML的Spring容器配置——Bean的作用域
  • Web开发:ORM框架之使用Freesql的分表分页写法
  • Android 设置铃声和闹钟
  • Docker--Kibana
  • MYSQL如何重置root密码
  • MYSQL使用角色
  • wx006基于springboot+vue+uniapp的电器维修系统小程序
  • uniapp下载打开实现方案,支持安卓ios和h5,下载文件到指定目录,安卓文件管理内可查看到
  • termux-boot安卓开机自动启动应用
  • Colyseus的room.onStateChange重复触发问题