c++学习笔记—内存概念

news2024/9/20 18:54:43

c++学习笔记

    • Bit
      • 含义
      • 用途
      • 特点
    • 字节
      • 含义
      • 用途
      • 特点
      • 注意事项
    • c++内存基本概念
      • 1. 栈(Stack)
      • 2. 堆(Heap)
      • 3. 全局/静态存储区
      • 4. 常量存储区
      • 5. 内存管理关键字和函数
      • 6. 内存泄漏
      • 7. 指针和引用
      • 8. 虚拟内存
      • 9. 内存对齐
      • 10. 构造和析构
    • c++中基本数据类型的内存占用
    • 程序在内存中的概念

Bit

bit(比特)是信息技术中的基本单位,用于表示数据的最小单位。以下是bit的含义和用途:

含义

  1. 二进制数位bit代表二进制数中的一个数位,它只有两个可能的值,通常表示为0或1。这是计算机内部处理信息的基础,因为计算机使用二进制系统。
  2. 信息单位:在信息理论中,bit是衡量信息量的单位。它可以用来表示一个信息源的不确定性或者信息传输过程中的信息量。

用途

  1. 数据存储:在数据存储中,bit是构成更大存储单位的基础,例如字节(byte),1字节等于8比特。
  2. 数据传输:在网络和通信中,bit用于衡量传输速率,例如以每秒比特数(bps)来表示。
  3. 数据处理:计算机处理器(CPU)的基本操作是在比特级别上进行的,包括逻辑运算(AND, OR, NOT等)和算术运算。
  4. 编码:在编码和解码过程中,bit用于表示不同的符号或信号状态。例如,莫斯电码使用一系列的点和划来表示不同的字符,每个点和划都可以被视为一个比特的信息。

特点

  • 简单性:由于bit只有两个状态,它非常适合电子电路的实现,因为电子信号通常只有高电平(1)和低电平(0)两种状态。
  • 组合性:虽然单个bit只能表示两种状态,但通过组合多个bit,可以表示非常多的不同值。例如,8个bit可以组合出256(2^8)种不同的状态,这足以表示所有的ASCII字符。
    总的来说,bit是数字信息世界的基础构建块,无论是存储、处理还是传输信息,都离不开bit的使用。

字节

字节(Byte)是计算机信息技术中的基本单位,用于计量数据量。以下是关于字节的含义和用途的详细说明:

含义

  1. 数据单位:字节是一个由8个比特(bits)组成的集合,通常表示为 “8-bit”。每个比特可以取0或1的值,因此一个字节可以表示256(2^8)种不同的状态或组合。
  2. 字符编码:在许多字符编码方案中(如ASCII),一个字节通常用来表示一个字符。例如,在ASCII编码中,标准的英文字母、数字、标点符号和控制字符都可以用一个字节来表示。

用途

  1. 存储容量:字节是衡量存储设备(如硬盘、固态硬盘、内存条)容量的基本单位。例如,一个文件的大小通常以字节为单位来表示。
  2. 数据传输:在网络通信中,字节也是衡量数据传输量的单位。网络速度(如带宽)通常以每秒传输的位数(bps)或字节(Bps)来表示。
  3. 数据处理:计算机处理器在处理数据时,通常以字节为单位进行操作。例如,读取或写入内存时,通常是按字节进行的。

特点

  • 可扩展性:字节可以组合成更大的数据单位,如:
    • 1 Kilobyte (KB) = 1,024 bytes
    • 1 Megabyte (MB) = 1,024 kilobytes
    • 1 Gigabyte (GB) = 1,024 megabytes
    • 1 Terabyte (TB) = 1,024 gigabytes
    • 依此类推。
  • 标准化:字节作为一个标准单位,被广泛应用于计算机硬件和软件中,是数据存储和传输的基本度量。

注意事项

  • 大小端序:在不同的计算机体系结构中,多字节数据的存储顺序可能不同,这称为字节序或端序(Endianness)。大端序(Big-Endian)和小端序(Little-Endian)是两种常见的字节序。
  • 变长编码:在某些字符编码(如UTF-8)中,字符可能由多个字节表示。这意味着一个字符的字节数量不是固定的,而是根据字符的不同而变化。
    字节是计算机科学中的核心概念之一,理解字节对于编写和理解计算机程序至关重要。

c++内存基本概念

在C++中,内存管理是一个核心概念,它直接关系到程序的性能和稳定性。以下是一些关于C++中内存概念的详细介绍:

1. 栈(Stack)

  • 局部变量存储:函数内的局部变量通常存储在栈上。
  • 自动分配和释放:当函数被调用时,其局部变量在栈上自动分配空间;当函数返回时,这些空间自动释放。
  • 大小限制:栈的大小通常有限,不同的系统和编译器有不同的限制。
  • 速度快:相对于堆来说,栈的分配和释放速度更快。

2. 堆(Heap)

  • 动态内存分配:堆用于动态分配内存,通常通过newdelete关键字进行管理。
  • 手动管理:程序员需要显式地分配和释放内存。
  • 大小无限制:理论上,堆的大小只受限于系统的虚拟内存。
  • 速度慢:相较于栈,堆的分配和释放速度较慢。

3. 全局/静态存储区

  • 全局变量和静态变量:存储在此区域的变量在程序启动时分配,在程序结束时释放。
  • 生命周期:这些变量的生命周期是整个程序的运行期间。

4. 常量存储区

  • 常量存储:用于存储常量,如字符串字面量。
  • 只读:这部分内存是只读的。

5. 内存管理关键字和函数

  • newdelete:用于在堆上动态分配和释放内存。
  • mallocfree:C语言风格的内存分配和释放函数,在C++中也可以使用。
  • new[]delete[]:用于动态分配和释放数组。

6. 内存泄漏

  • 未释放内存:如果动态分配的内存没有被适时释放,就会发生内存泄漏。
  • 后果:长期运行的程序可能会因为内存泄漏耗尽可用内存。

7. 指针和引用

  • 指针:变量,存储另一个变量的地址。
  • 引用:变量的别名,通常用来简化代码。

8. 虚拟内存

  • 地址映射:现代操作系统通过虚拟内存管理物理内存,为程序提供连续的内存地址空间。

9. 内存对齐

  • 数据对齐:为了提高内存访问效率,数据在内存中的位置可能需要按照一定的规则对齐。

10. 构造和析构

  • 构造函数:在对象创建时自动调用,用于初始化对象。
  • 析构函数:在对象销毁前自动调用,用于清理资源。
    理解这些内存概念对于编写高效且安全的C++代码至关重要。正确的内存管理可以避免许多常见的编程错误,如内存泄漏、野指针等。

c++中基本数据类型的内存占用

在C++中,整数的字节数取决于整数类型。以下是C++标准中定义的几种常见整数类型及其通常占用的字节数:

  1. char:
    • 通常占用1个字节(8位)。
    • 范围通常是 -128 到 127(对于有符号char)或者 0 到 255(对于无符号char)。
  2. short intshort:
    • 通常占用2个字节(16位)。
    • 范围通常是 -32,768 到 32,767。
  3. int:
    • 通常占用4个字节(32位)。
    • 范围通常是 -2,147,483,648 到 2,147,483,647。
  4. long intlong:
    • 在32位系统中通常占用4个字节,在64位系统中可能占用8个字节(64位)。
    • 范围依赖于字节数,对于4字节通常是 -2,147,483,648 到 2,147,483,647,对于8字节则是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
  5. long long intlong long:
    • 通常占用8个字节(64位)。
    • 范围是 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
  6. unsigned 类型(例如 unsigned int, unsigned long 等):
    • 占用的字节数与相应的有符号类型相同,但表示的范围是正数,因为它们不包括符号位。
      需要注意的是,C++标准并没有规定这些类型必须占用上述字节数,它只规定了每种类型的最小字节数。实际占用的字节数可能因编译器和平台的不同而有所差异。如果需要确切知道特定平台上某个类型的大小,可以使用C++的 sizeof 运算符,例如:
#include <iostream>
int main() {
    std::cout << "Size of char: " << sizeof(char) << " byte(s)" << std::endl;
    std::cout << "Size of short: " << sizeof(short) << " byte(s)" << std::endl;
    std::cout << "Size of int: " << sizeof(int) << " byte(s)" << std::endl;
    std::cout << "Size of long: " << sizeof(long) << " byte(s)" << std::endl;
    std::cout << "Size of long long: " << sizeof(long long) << " byte(s)" << std::endl;
    return 0;
}

这段代码将输出当前平台上各种整数类型所占用的字节数。

在C++中,浮点数类型通常代表实数,并且它们在内存中的占用空间取决于类型。以下是C++标准中定义的几种常见浮点数类型及其通常占用的字节数:

  1. float:
    • 通常占用4个字节(32位)。
    • 这通常符合IEEE 754单精度浮点数格式。
  2. double:
    • 通常占用8个字节(64位)。
    • 这通常符合IEEE 754双精度浮点数格式。
  3. long double:
    • 占用的字节数因编译器和平台而异。在许多系统上,它可能占用8个字节,但在某些系统上,它可能占用16个字节或更多。
    • 这通常用于提供比double更高的精度。
      以下是C++代码示例,用于确定各种浮点数类型在当前平台上的大小:
#include <iostream>
int main() {
    std::cout << "Size of float: " << sizeof(float) << " byte(s)" << std::endl;
    std::cout << "Size of double: " << sizeof(double) << " byte(s)" << std::endl;
    std::cout << "Size of long double: " << sizeof(long double) << " byte(s)" << std::endl;
    return 0;
}

当你运行这段代码时,它会输出当前平台上floatdoublelong double类型所占用的字节数。
需要注意的是,尽管大多数现代系统遵循IEEE 754标准,但long double的确切大小和行为可能因编译器和平台而异。在某些系统上,long double可能只是double的同义词,或者它可能使用不同的内部表示,提供不同的精度和范围。

程序在内存中的概念

每个程序启动后,系统会将程序加载到内存,并为程序分配上下文空间。

  • 作为文件时是一个二进制的文件
  • 加载执行时,在内存中的上下文空间(静态常量区.data数据区、代码区.code)
  • 静态常量数据区:存放程序以来的各种数据,例如 const char* name = “huahua”; 这个变量的huahua会存放到上下文的数据区,此时name指针指向数据区地址,等等各类程序需要的数据都会放到该区域。

程序启动时,系统会为程序创建一个进程,进程中就包含程序的上下文空间。进程创建完毕后,会接着创建主线程(真正干活的东西)。每个进程最少有一个主线程,主线程对接的则是main对应的入口函数为起点并进行执行。当进程的主线程结束后,整个进程将会进行内存释放和清理,然后退出程序。
每个线程都有线程专有的栈空间(4mb)。

在这里插入图片描述

堆空间,简单理解为内存条的整个空间。有操作系统管理和分配。

虚拟空间,内存不够时候把磁盘划分一定区域去当作内存使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970574.html

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

相关文章

用神经网络求解方案

在处理密集、计算量大的数学问题时&#xff0c;计算机系统一直是人类最好的朋友。从计算器上的简单计算到 R 中的大型统计运算&#xff0c;这一技术前沿使我们很多人的生活变得更加轻松。 然而&#xff0c;即使是计算机&#xff0c;当数字变成字母并开始涉及代数时&#xff0c…

微信公众号使用介绍

写在前面&#xff0c;楼下有个医生小姐姐想做个公众号&#xff0c;整理了一份文档入门用 一 订阅号和服务号区别 1.1 关于功能上的差异 订阅号&#xff08;Subscription Account&#xff09; 定位&#xff1a;主要用于提供信息传播和互动&#xff0c;适合媒体、个人博主、机…

一文全面了解HPC高性能计算平台是什么、怎么选型?高性能计算平台CHPC 都能做什么?

一. 概述 随着技术的发展和数据量的爆炸性增长&#xff0c;企业面临的挑战日益复杂&#xff0c;对计算能力的需求也在不断增加。这些问题的解决超出了传统计算方法的能力范围&#xff0c;高性能计算&#xff08;HPC&#xff09;正是为解决这类问题而生。 高性能计算&#xff…

【Linux】Linux下的日志(日常级)

日志是日后工作中非常重要的一部分&#xff0c;现在写一份简单的日志项目可以帮助我们熟悉并理解原理。 目录 设计思路&#xff1a;一些实现细节&#xff1a;代码&#xff1a;日志的使用方法&#xff1a; 设计思路&#xff1a; 图示是我们的最终目的。 设计一个类&#xff0…

是否掌握数据结构对于IT职业发展至关重要?

算法跟代码实现有时候是两回事&#xff0c;在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#…

Cesium 限高分析

Cesium 限高分析 原理&#xff1a;ClassificationPrimitive贴模型的运用 效果图

兼容性最好的模拟器,主要为高端平板设计

一、简介 1、蓝叠安卓模拟器是BlueStacks公司推出的全球知名Android模拟器。它可能是兼容性最好的模拟器&#xff0c;主要为高端平板设计&#xff0c;加入了图形硬件加速&#xff0c;并与AMD合作。 二、下载 1、文末有下载链接,不明白可以私聊我哈&#xff08;麻烦咚咚咚&#…

新迪天工CAD,国际水平的国产三维CAD软件

新迪数字 定位&#xff1a;国际领先的三维CAD软件厂商 使命&#xff1a;掌握核心技术&#xff0c;推动中国创造 愿景&#xff1a;让每个工程师使用中国CAD 上海新迪数字技术有限公司是一家拥有国际先进水平三维CAD核心技术的国产工业软件厂商&#xff0c;由国际工业软件领域知…

今日头条爬虫(zhanzhang.toutiao.com)IP及UA,真实采集数据

​ 一、数据来源&#xff1a; 1、这批今日头条爬虫(zhanzhang.toutiao.com)IP来源于尚贤达猎头网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“zhanzhang.toutiao.com”和…

职场进阶还是智商税?一文看六西格玛绿带培训的真面目

随着企业对精细化管理需求的日益增长&#xff0c;六西格玛绿带培训逐渐成为职场人士争相追逐的热门课程。它不仅能够帮助学员掌握先进的质量管理工具&#xff0c;还能培养逻辑思维、数据分析能力以及团队合作精神&#xff0c;这些都是现代职场不可或缺的软实力。 职场助力or智商…

小程序商品图片有什么要求

在当今信息化的社会中&#xff0c;无论是组织活动、培训课程还是社交聚会&#xff0c;高效、准确地收集报名信息并进行有效匹配显得尤为重要。为此&#xff0c;我们开发了一款全新的报名匹配工具&#xff0c;旨在帮助活动组织者轻松管理报名流程&#xff0c;同时确保参与者能够…

机器学习 第8章-集成学习

机器学习 第8章-集成学习 8.1 个体与集成 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务&#xff0c;有时也被称为多分类器系统(multi-classifersystem)、基于委员会的学习(committee-based learning)等。 图8.1显示出集成学习的一般结构:先产生一组“…

day15 Java基础——包机制

day15 Java基础——包机制 Java包机制是一种组织和管理类和接口的方式&#xff0c;通过将相关的类和接口放入同一个包中&#xff0c;可以避免命名冲突&#xff0c;提高代码的可重用性和可维护性。包采用层次化的命名空间&#xff0c;以点号分隔&#xff0c;如java.util。使用i…

标题:组合式API:优化Vue代码结构的艺术

摘要&#xff1a; 在Vue 3中&#xff0c;引入了组合式API&#xff0c;它提供了一种新的方式来组织组件逻辑。虽然组合式API带来了更高的灵活性和可维护性&#xff0c;但开发者也面临着代码组织和可读性的挑战。本文将探讨如何有效地利用组合式API&#xff0c;优化Vue代码结构&a…

深化理解电子商务领域的“二清”风险与合规路径

在电子商务的快速发展中&#xff0c;“二清”风险成为了不容忽视的话题。这一现象不仅触及金融监管红线&#xff0c;还潜藏诸多风险&#xff0c;包括资金安全、信息泄露、合规性挑战以及监管盲点。鉴于“二清”问题的复杂性与潜在危害&#xff0c;电商平台必须采取有效措施&…

FPGA知识基础之--500ms计数器,边沿检测,按键消抖

目录 前言一、边沿检测1.1 使用背景1.2 方法&#xff1a;打拍法1.2.1 背景1.2.2 原理1.2.3 上升沿 二、计数器2.1 原理2.2 RTL代码 三、按键消抖 前言 一、边沿检测 1.1 使用背景 在我们设计电路时&#xff0c;经常会遇到需要继续检测上升沿和下降沿的电路&#xff0c;因此需…

劳动仲裁经验篇【赶紧收藏】

【劳动仲裁】纯经验干货分享&#xff0c;点个关注防止需要时找不到&#xff01; 当公司决定搞你心态&#xff0c;变相逼退你时&#xff0c;无非就那么些手段&#xff0c;只要你能正确应对&#xff0c;并做好收集证据的准备&#xff0c;就不住畏惧。合理利用法律的武器维护自身…

大模型书籍电子书上新 |《图技术与大模型在多领域的应用》

资料目录及介绍&#xff1a; GraphGPT: 大语言模型的图结构指令微调 GraphGPT旨在使大语言模型理解图结构数据&#xff0c;执行图相关任务如节点分类和链接预测。面对图数据多样性和大模型能力迁移的挑战&#xff0c;GraphGPT探讨了图输入方法、模型对齐及推理能力增强等解决…

重生奇迹MU 从不孤军奋战

重生奇迹MU的世界里&#xff0c;每个职业都有自己的独特魅力和优势。本文将讲述圣导师和弓箭手在游戏中的表现&#xff0c;他们不仅拥有强大的个人实力&#xff0c;更擅长与队友协作奋战&#xff0c;成为团队推进的重要力量。无论你选择哪个职业&#xff0c;与他们一起并肩作战…

【pikachu靶场】之ITOver Permission越权漏洞

一、水平越权&#xff1a; 查看一下提示 里面有用户名和密码&#xff0c;&#xff0c;后面要用。。 登录一个用户 在地址栏里可以看到lili用户名直接被显示到了里面&#xff0c;可以直接在这里修改切换到其他的用户。 修改用户 我修改用户为lucy后&#xff0c;就看到了lucy…