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

server/2024/12/25 2:13:39/
  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.ppmy.cn/server/152936.html

相关文章

蓝桥杯刷题——day9

蓝桥杯刷题——day9 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 小蓝最近在研究一种浮点数的表示方法&#xff1a;R格式。对于一个大于0的浮点数d&#xff0c;可以用R格式的整数来表示。给定一个转换参数n&#xff0c;将浮点数转换为R格式整…

golang 并发--goroutine(四)

golang 语言最大的特点之一就是语法上支持并发&#xff0c;通过简单的语法很容易就能创建一个 go 程&#xff0c;这就使得 golang 天生适合写高并发的程序。这一章节我们就主要介绍 go 程&#xff0c;但是要想完全理解 go 程我们需要深入研究 GPM 模型&#xff0c;关于 GPM 模型…

WebXR

HTTPS https网页才能启动VR模式&#xff0c;本地调试时配置https vite 启用 https npm install -D vitejs/plugin-basic-ssl --save vite.config.js import { defineConfig } from vite; import basicSsl from vitejs/plugin-basic-ssl;export default defineConfig({serv…

使用 HTML5 Canvas 实现动态蜈蚣动画

使用 HTML5 Canvas 实现动态蜈蚣动画 1. 项目概述 我们将通过 HTML 和 JavaScript 创建一个动态蜈蚣。蜈蚣由多个节段组成&#xff0c;每个节段看起来像一个小圆形&#xff0c;并且每个节段上都附带有“脚”。蜈蚣的头部会在画布上随机移动。 完整代码在底部&#xff01;&…

编译笔记:vs 中 正在从以下位置***加载符号 C# 中捕获C/C++抛出的异常

加载符号 解决方法&#xff1a; 进入VS—工具—选项----调试----符号&#xff0c;看右边有个“Microsoft符号服务器”&#xff0c;将前面的勾去掉&#xff0c;&#xff08;可能还有删除下面的那个缓存&#xff09;。 参考 C# 中捕获C/C抛出的异常 在需要捕捉破坏性异常的函数…

JS中的innerHTML,innerText,value的区别

目录 Document 对象 主要用途 getElementById() 方法 innerHTML innerText value Document 对象 Document 对象&#xff0c;当 HTML 文档加载到 Web 浏览器中时&#xff0c;它就变成了一个文档对象。文档对象是 HTML 文档的根节点。文档对象是窗口对象的属性。 在JavaSc…

前端开发 详解 Node. js 都有哪些全局对象?

在 Node.js 中&#xff0c;全局对象&#xff08;Global Objects&#xff09;是指在任何模块中都可以直接访问的对象和变量&#xff0c;而不需要显式地进行导入。Node.js 提供了一些全局对象&#xff0c;帮助开发者在编写应用程序时更加方便地进行一些常见操作&#xff0c;如文件…

WebContainerapi 基础(Web IDE 技术探索 一)

前言 随着web技术的发展&#xff0c;在网页端直接运行node.js、实现微型操作系统已经不再是难事。今天介绍的 WebContainers就是一个基于浏览器的运行时&#xff0c;用于执行 Node.js 应用程序和操作系统命令&#xff0c;它完全运行在您的浏览器页面中&#xff0c;提供了文件系…