【C++】016、栈和堆的区别

【016】C++ 预处理:内存分区、变量存储、头文件、宏,你都掌握了吗? C++预处理器是一个非常重要的编译阶段,它在源代码被编译之前对源代码进行一些操作。#define:定义宏常量或宏函数,可以提高代码的可读性和可维护性。:条件编译指令,用于根据条件选择是否编译某段代码。#include:包含头文件,将其他源代码文件中的定义导入到当前文件中以供使用。#pragma:通用预处理命令,用于指示编译器执行特定的动作或更改默认行为。#error:产生错误消息并停止编译过程。#undef:取消已定义的宏。除了上述常见预处理指令外,C++还有一些其他的预处理功能,例如。 阅读详情

一、栈的堆的本质区别

堆和栈都是程序运行时数据在内存中存储的不同区域。

他们的本质区别在于管理权限权归属: 栈由编译器自动管理,堆由程序员手动管理,或由智能指针托管

二、栈与堆的六个比对

1、生命周期不同

栈:绑定作用域

  • 变量在声明时创建,离开作用域{}时,立刻析构销毁,确定性强

堆:绑定手动操作

  • new、malloc操作后一直存在,直到delete,free被调用或进程结束,不确定强。

2、分配方式不同

栈由编译器隐式分配:

  • 直接修改栈顶指针来划分空间

堆由程序员显示申请:

  • 需要调用操作系统提供的接口brk或mmap,在空闲链表中查找内存块

3、速度

栈>堆

  • 栈分配仅需一条cpu指令,堆分配涉及操作系统调用,和空闲链表遍历

  • 建议频繁小对象的创建操作,使用栈而不是使用new

4、大小

栈极小:默认只有1-8MB

  • 栈溢出会报错 stack overflow

堆很大:

  • 受系统虚拟内存限制,可达GB级别

5、碎片问题

栈无碎片:

  • 严格的LIFO

堆有碎片:

  • 在申请与销毁内存时造成内存缝隙

6、线程安全

栈天然线程安全:

  • 每个线程拥有独立的栈空间,局部变量是线程私有的

堆默认线程不安全:

  • 堆内存是所有线程共享的。

三、其他内存区域

  • 除了栈和堆外,内存区域还有 静态存储区 与 常量区

  • 字符串string存储位置,如果是端字符串会进行优化存储在栈上,长字符串使用堆保存

四、栈与堆在工程中的使用

使用原则:能用栈则栈,必须用堆则使用智能指针托管

  • 小数据,确定的生命周期使用栈

  • 大数据,多态对象,容器内部用堆

  • 现代C++建议尽量不用new/delete,改为使用智能指针unique_ptr 与 make_unique来申请内存。

嵌入式100题(016):new和malloc的区别 new和malloc的区别 new是操作符,而malloc是函数。 new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数。 new是类型安全的,malloc返回void*。 new可以被重载。 new分配内存更直接和安全。 malloc 可以被realloc。 new发生错误抛出异常,malloc返回null。 malloc可以分配任意字节,new只能分配实例所占内存的整数倍大小。 ... 阅读详情

相关推荐

C++中静态存储区与栈以及堆的区别详解

学习c++如果不了解内存分配是一件非常可悲的事情。而且,可以这样讲,一个C++程序员无法掌握内存、无法了解内存,是不能够成为一个合格的C++程序员的。一、内存基本构成可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。堆区:亦称动态内存分配。程序在运行的时候用

C++ 栈和堆的区别

   C++中的存储区分为全局数据区、代码区、堆、栈。   全局数据区存放静态数据、全局变量、常量。   代码区存放所有类成员函数和非成员函数的代码。   栈区存放用于函数的返回地址、形参、局部变量、返回类型。   堆区存放余下的内存(new和delete)。   堆和栈的区别: 1、申请方式不同:栈是系统自动分配,堆是程序员申请。 2、系统响应不同:   栈:只要栈的剩余空...

weixin_30696427的博客 774

手把手教你搞定6脚三位一体数码管的驱动(附C语言源码与Visual Studio调试技巧)

本文详细解析了6脚三位一体数码管的驱动原理与实战技巧,包括引脚复用、动态扫描时序、Visual Studio模拟调试及单片机实现。通过C语言源码示例和调试技巧,帮助开发者快速掌握非标准数码管的驱动方法,提升硬件开发效率。

weixin_30613727的博客 589

C++堆和栈的区别

1. 堆栈的区别? (1)堆栈空间分配区别: 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈; 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 (2)堆栈的缓存方式区别 栈:是内存中存储值类型的,大小为2M(window,linux下默认为8M,可以更改),超出则会报错,...

luweiwei123的博客 1272

01 Aras Innovator二次开发实战:从IOM到AML的完整交互指南

本文详细介绍了Aras Innovator二次开发实战,从IOM到AML的完整交互指南。通过JavaScript和C#代码示例,展示了如何在客户端和服务端使用IOM进行开发,并深入解析AML语言的基础语法和调试技巧。文章还提供了文档管理和BOM管理等典型场景的实战案例,帮助开发者快速掌握Aras Innovator二次开发的核心技术。

wind6的博客 650

量化爬虫第一步:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向实战)

本文详细介绍了如何通过JS逆向技术破解同花顺问财数据接口的核心加密参数hexin-v,构建稳定可靠的量化数据采集方案。从抓包分析到Cookie Hook技术应用,再到环境补全与参数生成实现,手把手教你完成量化爬虫的第一步。文章还提供了实战注意事项与优化建议,帮助开发者规避常见问题。

weixin_42620202的博客 301

C++ 中堆和栈的区别

在C++中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区,就是那些由malloc()等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。全局/静态存储区,全局

657

从Starlink看NTN:SSB波束数量少,用户体验真的会差吗?

当SpaceX的Starlink以每月新增上百颗卫星的速度扩张其星座时,一个有趣的技术现象正在引发行业讨论:为何这个全球最大的低轨卫星网络选择使用相对较少的波束数量?波束数量的选择远非简单的技术参数,而是系统设计哲学、商业策略与终端用户体验的复杂平衡。传统地面网络可以依赖密集基站实现精准覆盖,而卫星通信必须面对一个根本性挑战:如何在数百公里的高空,用有限的射频资源服务广阔的地理区域。当我们在撒哈拉沙漠测试不同波束方案时,发现了一个关键洞见:最佳波束数量不是固定的技术参数,而是随网络发展阶段变化的动态值。

weixin_32308101的博客 332

C/C++堆和栈的区别

堆和栈的区别 1.管理方式不同 栈,由编译器自动管理,无需程序员手工控制;堆:产生和释放由程序员控制。 2.空间大小不同 栈的空间有限;堆内存可以达到4G,。 3.能否产生碎片不同 栈不会产生碎片,因为栈是种先进后出的队列。堆则容易产生碎片,多次的new/delete 会造成内存的不连续,从而造成大量的碎片。 4.生长方向不同 堆的生长方式是向上的,栈是向下的。 5.分配方式不同 堆是动态分配的。栈可以是静态分配和动...

looklight的博客 1042

浮点数精度陷阱全解析:从IEEE 754到深度学习部署选型

在计算机数值计算中,浮点数是表示带小数数字的标准方式,但它的存储规则决定了精度和边界天生存在限制。许多开发者都曾遭遇过0.1+0.2不等于0.3的尴尬,或是模型训练中loss变成NaN的困扰,这些问题的根源往往指向IEEE 754标准中的规格化、非规格化表示及舍入规则。理解浮点数的底层原理,不仅能避开直接的比较判断陷阱,还能指导我们在不同场景下做出合理的技术选型。从C语言的printf到Python的repr,从嵌入式串口打印到深度学习中的FP32、FP16、BF16、TF32格式,浮点数知识贯穿底层开发和

weixin_34314962的博客 462

知识库构建革命:基于Agent的智能检索系统设计

本文聚焦“基于Agent的智能检索系统”这一前沿技术,系统讲解其设计逻辑、核心技术与落地方法。我们将覆盖从基础概念(如Agent如何“理解”知识)到实战代码(如何用Python搭建原型系统)的全链路内容,帮助技术开发者、企业知识管理负责人理解这一技术为何能颠覆传统知识库。本文将按“问题引入→核心概念→技术原理→实战落地→未来趋势”的逻辑展开:先用“老图书馆的困境”故事引出传统知识库的问题;再用“智能图书管理员”类比解释Agent如何革新检索;接着拆解NLP、对话管理、知识推理等核心技术;

AI智能探索者的博客 724

堆和栈的几点区别

堆和栈一直分得不太清楚,所以今天决定整理一下 结构: 栈(stack)又名堆栈,它是一种先进后出(FILO)的线性表。 特点:容量小 速度快 适合存放小型数据 如 基本数据类型和对象类型的引用 堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。常见的堆有二叉堆、斐波那契堆等。 堆的特点和栈相反 : ...

iteye_19739的博客 129

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)

物联网系列③——基于ESP8266与点灯科技平台的温湿度计设计(接入小爱同学)一、设计目标二、电路展示三、存在的问题四、代码五、需要注意的问题 一、设计目标       前一阵子偶然接触到点灯科技平台,产生了制作一块ESP8266电路板,拥有以下功能: 使用CH340对ESP8266进行程序下载 使用DHT11进行温湿度数据读取 使用点灯科技平台接入物联网,可通过手机APP获得室内温湿度 接入小爱同学,通过语音获取室内温湿度信息 Mico US

weixin_43278295的博客 8852

[C++面试高频]C++基础(十二)

C++,C语言笔试真题

qq_39595998的博客 208

OpenClaw与传统AI助手区别,为什么要本地部署

OpenClaw是一款本地部署的开源AI助手框架,与ChatGPT等云端服务相比具有显著优势。它支持完全离线运行,数据隐私性高,所有信息都存储在本地设备上,避免了云端服务的隐私风险。OpenClaw采用模块化设计,可自由定制功能,且无需支付订阅费用,只需一次性硬件投入。推荐在树莓派、迷你主机等设备上部署,最低配置仅需1核CPU和1GB内存。安装过程包含系统初始化、依赖安装、配置设置等步骤,支持通过systemd服务实现开机自启和后台运行。特别适合注重数据安全、需要离线使用或预算有限的用户群体。

一键难忘的博客 1687

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

016集—— 结构体和类的区别与联系——C#学习笔记

当把一个结构类型的变量赋值给另一个结构时,对性能的影响取决于结构的大小,如果结构的数据成员非常多而且复杂,就会造成损失,接下来使用一段代码来说明这个问题。对于点、矩形和颜色这样的轻量对象,假如要声明一个含有许多个颜色对象的数组,则CLR需要为每个对象分配内存,在这种情况下,使用结构的成本较低;由于结构是值类型,并且直接存储数据,因此在一个对象的主要成员为数据且数据量不大的情况下,使用结构会带来更好的性能。结构类型直接存储成员数据,让其他类的数据位于堆中,位于栈中的变量保存的是指向堆中数据对象的引用。

山水CAD 二次开发 510

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++笔记016:const 基础

原创笔记,转载请注明出处! 点击【关注】,关注也是一种美德~ 笔记十六关于const关键字,在C语言和C++中const的表现是不同的。 先看一下const基础知识。 对const的初级理解:const是定义常量,const意味着只读。 掌握const最基本的关键点是:指针变量和它所指向的内存空间变量是两个不同的概念,看const是修饰指针本身,还是...

aidianb225973的博客 117

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

016 - 如何写一个 C++ 类

到目前为止,我们学了类 class,本期我们要尝试着从头开始写一个类。本期不会讲的太深。我们不会写非常复杂的类,我们要会完成一个基本的 log 类,来演示一下我们已经学过的相关知识。接下来的几期,我们会继续学习类。并引入一些新的概念。所以你会看到从一个基本版本的类到一个做同样事情的更高级版本的类的过程和区别。它们是更为完整的代码。让我们来开始写我们的 log 类。

九灵猴君的博客 924

C++学习笔记(三)

本文整理了C++编程基础的核心知识点,主要内容包括:1. C++内存管理:详细解析代码区、静态数据区、栈区、堆区的功能特点,介绍内存地址概念及变量存储原理;2. 指针基础:讲解指针的定义与使用、解引用操作、指针类型的内存占用等核心概念;3. const关键字:分析常量变量、常量指针、指针常量等不同用法,区分顶层与底层const;4. 枚举类型:对比传统枚举与C++11强类型枚举(enum class),说明枚举的定义、赋值和使用方法;5. 编程基础:涵盖变量作用域、数据类型、二进制相关概念等基础知识。文章通

ShangguanLuli的博客 1183

面型对象(Num016)

提出问题,分析问题的处理流程,将大问题分解成小问题,如果小问题比较复杂,那么就继续的分解为更小的问题,然后解决这些一个一个的小问题来解决大问题,最后解决所有的问题。面向对象的程序设计是面向过程的继承和发展,程序对现实世界的抽象和描述。在面向过程中,数据和行为是分开的,面向对象将数据和行为结合在一起,共同来表达一个数据。是有数据加功能构成的,也就是变量和函数,把变量和函数绑定在一起。公有属性:类外和类中都可以被直接访问,类外通过对象访问。类中成员,可以定义变量或函数。结构体的默认访问属性是公有,类是私有。

weixin_41576682的博客 1061

[Effective C++ --016]成对使用New和Delete时要采用相同形式

这一节比较简单,可以总结为以下: std::string *stringPtr1 = new std::string; std::string *stringPtr2 = new std::string[100]; .. delete stringPtr1; // delete an object delete [] stringPtr...

weixin_30416497的博客 80

016【入门】双端队列

C++ STL 里面有它可以在。

abjgdgf的博客 181

016:堆栈详解(转)

堆栈详解 http://www.cnblogs.com/guanjie20/archive/2009/03/12/1410067.html 什么是堆栈  在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。  堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。  要点:  堆:顺序随意  ...

weixin_30608503的博客 67

C++精选面试题集合(100份大厂面经提取的200+道真题)

本文总结了C/C++核心知识、数据结构与算法、开发工具与调试、设计模式、操作系统、网络编程、数据库、服务器开发等面试重点内容。其中C++部分包括智能指针、多态机制、内存管理等核心概念;数据结构和算法涵盖链表、排序、二叉树等常见题型;网络编程重点分析TCP/IP协议、HTTP协议及高性能网络模型;数据库部分详解MySQL索引、事务隔离和Redis缓存策略。此外还提供了项目经验、系统设计等开放性问题的应对策略,为技术面试提供全面指导。全文系统梳理了各技术领域的核心考点和解题思路,适合准备校招或社招的开发者参考学

2401_86353562的博客 1891

C/C++ 知识点:指针与数组名区别

从输出结果可以看出来,sizeof()的结果是4,说明此时的数组名是一个普通指针。

个人技术博客 348
上一篇: 【C++】015、函数参数:值传递,指针传递,引用传递的区别
下一篇: 【C++】017、new/delete与malloc/free的区别
Tim_10
博客等级 码龄2年 162粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值