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.mzph.cn/diannao/64986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

f(f(x))=x^2 -11x+36, 求f(6)的值,

偶然看到的一个题目&#xff0c;一时兴起&#xff0c;做了一下。题目如下 简单粗暴的思路是待定系数法&#xff0c;盲猜f(x)是个2次函数&#xff0c;令f(x)ax^2bxc ,带入原式&#xff0c;发现矛盾&#xff08;计算略&#xff09;就想放弃了。 忽然看到如果带入6 的话&#xf…

用Python PySide6 复刻了两软件UI 做下练习

图样 1 代码 1&#xff1a; # -*- coding: utf-8 -*-import sys from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QDate) from PySide6.QtGui import QIcon, QPixmap, QColor from PySide6.QtWidgets import (QApplication, QDialog, QLineEdit, QPushBut…

C语言结构体详细讲解

文章目录 [TOC] 一、前言二、结构体2.1 结构体概念&#x1f388;2.2 结构体定义&#x1f389;2.3 结构体使用&#x1f397;️2.4 结构体数组使用&#x1f397;️ 结尾 时间紧后面还有一些知识点这周内补上&#xff0c; 理解理解&#xff01;(❁◡❁) 一、前言 在学习结构体之前…

活动图的理解和实践

在软件开发和系统设计中&#xff0c;理解系统的工作流程和并发行为是至关重要的。活动图作为一种重要的建模工具&#xff0c;为我们提供了一种直观且有效的方法来描述这些复杂的过程。本文将详细探讨活动图的理解与实践&#xff0c;包括其基本概念、用途、构建方法以及实际应用…

简述Git中如何将一个新增文件添加到本地仓库?

在Git中&#xff0c;将一个新增文件添加到本地仓库通常需要以下步骤&#xff1a; 将文件添加到暂存区&#xff1a;首先&#xff0c;你需要使用git add命令来将新文件添加到暂存区。 使用文件名&#xff1a;git add <filename>使用点号添加所有文件&#xff1a;git add .使…

memcached 与 redis 的区别?

1、Redis 不仅 仅 支 持 简 单 的 k/v 类型 的 数 据 &#xff0c;同时 还 提 供 list&#xff0c;set&#xff0c;zset&#xff0c;hash等数 据 结 构 的 存 储 。而 memcache 只支 持 简 单 数 据 类 型 &#xff0c;需要 客 户 端 自 己 处 理 复杂对 象 2、 Redis 支持 数 …

Redis缓存数据库

1、介绍 redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库 redis的官网&#xff1a;redis.io 注:域名后缀io属于国家域名&#xff0c;是british Indian Ocean territory&#xff0c;即英属印度洋领地 1、redis的特点: 1.丰富的数…

flink sink kafka

接上文&#xff1a;一文说清flink从编码到部署上线 之前写了kafka source&#xff0c;现在补充kafka sink。完善kafka相关操作。 环境说明&#xff1a;MySQL&#xff1a;5.7&#xff1b;flink&#xff1a;1.14.0&#xff1b;hadoop&#xff1a;3.0.0&#xff1b;操作系统&#…

WebRTC搭建与应用(五)-Coturn踩坑记

WebRTC搭建与应用(五)-Coturn踩坑记 近期由于项目需要在研究前端WebGL渲染转为云渲染&#xff0c;借此机会对WebRTC等有了初步了解&#xff0c;在此记录一下&#xff0c;以防遗忘。 第五章 WebRTC搭建与应用(五)-Coturn踩坑记 文章目录 WebRTC搭建与应用(五)-Coturn踩坑记前…

@vue/cli启动异常:ENOENT: no such file or directory, scandir

参考:https://blog.csdn.net/qq_44355188/article/details/122239566 首先异常报错是&#xff1a;ENOENT: no such file or directory, scandir ‘D:\Data\Project\VueProject\hello\node_modulesvue\cli-plugin-eslint\locales’&#xff1b;我的vue/cli版本是 4.5.15 重点是…

Lua 函数

Lua 函数 1. 概述 Lua是一种轻量级的编程语言&#xff0c;常用于游戏开发、脚本编写和嵌入式系统。在Lua中&#xff0c;函数是一等公民&#xff0c;意味着它们可以作为变量传递&#xff0c;也可以作为参数传递给其他函数。本文将详细介绍Lua中的函数&#xff0c;包括函数的定…

Git进阶:本地或远程仓库如何回滚到之前的某个commit

在Git的使用过程中&#xff0c;我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改&#xff0c;还是为了重新组织代码&#xff0c;回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法&#xff0c;帮助读者更好地掌握Git版本控制…

【java设计模式】1 - 软件设计原则

1&#xff0c;软件设计原则 在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&#xff0c;从而提高软件开发效率、节约软件开发成本和维护成本。 1.1 开闭原则 对扩展开…

NS3学习——tcpVegas算法代码详解(1)

目录 一、源码 二、详解 1.定义日志和命名空间 2.注册Typeld类:TcpVegas和GetTypeId方法的实现 3.构造函数和析构函数 4.TcpVegas类中成员函数 (1) Fork函数 (2) PktsAcked函数 (3) EnableVegas函数 (4) DisableVegas函数 一、源码 /* -*- Mode:C; c-file-style:&qu…

如何安全获取股票实时数据API并在服务器运行?

以下是安全获取股票实时数据 API 并在服务器运行的方法&#xff1a; 选择合适的券商或交易平台 评估自身需求&#xff1a;明确自己的交易策略、交易品种、交易频率等需求&#xff0c;以及对 股票api 的功能、性能、稳定性等方面的要求。调研券商或平台&#xff1a;了解不同券商…

Nginx 常用安全头

Web 应用中配置 HTTP 安全响应头是提升网站安全性的重要一步。合理配置 Nginx 的安全头&#xff0c;可以抵御常见的安全威胁&#xff08;如 XSS、点击劫持、MIME 类型嗅探等&#xff09;&#xff0c;增强用户隐私保护和传输安全性。 常见的 HTTP 安全头及其作用 1. Content-Se…

kali切换root用户显示su: Authentication failure解决方案

1.切换root用户显示su: Authentication failure 2.解决方式&#xff1a;使用sudo su命令 3.密码新版的应该都是kali

一篇文章学会HTML

目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…

【开源】一款基于SpringBoot的智慧小区物业管理系统

一、下载项目文件 项目文件源码链接&#xff1a;https://pan.quark.cn/s/3998d958e182如出现网盘空间不够存的情况&#xff01;&#xff01;&#xff01;解决办法是先用夸克手机app注册&#xff0c;然后保存上方链接&#xff0c;就可以得到1TB空间了&#xff01;&#xff01;&…

北理工计算机考研难度分析

总体情况概述 北京理工大学计算机学院2024届考研呈现出学硕扩招、专硕稳定的特点。学硕实际录取27人(含非全统考)&#xff0c;复试线360分&#xff0c;复试录取率76%&#xff1b;计算机技术专硕(不含珠海)实际录取29人&#xff0c;复试线324分&#xff0c;复试录取率86%。两个…