返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C/C++内存区域划分(简而易懂)
  • 474
分享到

详解C/C++内存区域划分(简而易懂)

2024-04-02 19:04:59 474人浏览 薄情痞子
摘要

C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名; 2. 内存堆区: 存放new或者malloc出来的对象; 3. 常数区: 存放局部变量或者全局变量的

C语言在内存中一共分为如下几个区域,分别是:

1. 内存栈区: 存放局部变量名;
2. 内存堆区: 存放new或者malloc出来的对象;
3. 常数区: 存放局部变量或者全局变量的值;
4. 静态区: 用于存放全局变量或者静态变量;
5. 代码区:二进制代码。
知道如上一些内存分配机制,有助于我们理解指针的概念。

C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。

C/C++内存区域划分详解

C/C++内存分布

在这里插入图片描述

C/c++中,内存主要分为、堆、栈、全局/静态存储区和常量存储区。

栈:栈又叫堆栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等,是向下增长的。所谓向下生长的就是,先调用的栈帧的地址比后调用的地址大,栈一般大小有几个M左右。


#include<iOStream>
using namespace std;

void f2()
{
	int b = 0;
	cout << "b:" << &b << endl;
}
void f1()
{
	int a = 0;
	cout <<"a:" <<&a << endl;

	f2();
}
int main()
{
	f1();
	return 0;
}

在这里插入图片描述

堆:就是那些由new/malloc分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new/malloc就要对应一个delete/free,由程序员主动释放。堆是可以上增长的.意思是先建立的堆的地址小于后建立的堆的地址。


#include<iostream>
using namespace std;

int main()
{
	void* p1 = malloc(10);
	void* p2 = malloc(10);

	cout << p1 << endl;
	cout << p2 << endl;

	return 0;
}

在这里插入图片描述

数据段:存储全局数据和静态数据。
代码段:可执行的代码/只读常量

知道了内存分布,下面就来做题吧,考验知识的时候到了,看看会做几题吧

在这里插入图片描述

是不是前几题还得心应手,后面就有点懵了

在这里插入图片描述
在这里插入图片描述

栈和堆的区别:

栈:由编译器自动分配并且释放,一般存储函数的参数局部变量等
堆:由程序员分配释放,若程不释放则系统释放

1、申请内存方式
栈:由系统自动分配,如变量的声明的同时会开辟空间,(int a; 开辟4个字节的空间)(静态指定)

堆:由程序员申请,需要制定大小(动态分配)
2、系统响应的不同

栈:只要剩余空间大于申请内存,系统就会提供,否则会栈溢出

堆:便历空闲地址链表,找到符合要求的,就删除该地址分配给程序,内存的首地址记录分配的大小,(方便delete)多余的内存回收

3、空间大小不同
栈:连续的,编译时就确定的常数
堆:不连续,他的上限决定于系统中有效的虚拟内存
4、执行效率的不同
栈:由系统分配,速度快
堆:程序员分配,速度慢,容易产生内存碎片,不过用起来方便

到此这篇关于C/C++内存区域划分详解的文章就介绍到这了,更多相关C++内存划分内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解C/C++内存区域划分(简而易懂)

本文链接: https://lsjlt.com/news/129206.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解C/C++内存区域划分(简而易懂)
    C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名; 2. 内存堆区: 存放new或者malloc出来的对象; 3. 常数区: 存放局部变量或者全局变量的...
    99+
    2024-04-02
  • Java虚拟机内存区域划分详解
    在谈 JVM 内存区域划分之前,我们先来看一下 Java 程序的具体执行过程,我画了一幅图。 Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载...
    99+
    2024-04-02
  • JVM内存区域划分相关原理详解
    JVM内存区域划分是指将JVM中的内存划分为不同的区域,每个区域有不同的用途和管理方式。JVM内存区域的划分主要有以下几个方面:1....
    99+
    2023-08-11
    JVM
  • C语言动态内存规划详解
    目录动态内存规划动态内存函数的介绍总结动态内存规划 用C语言写程序时,因为语言的一些特性使用数组的时候只能用常量来申明数组,就导致数组的内存被卡得很死,不能根据我们的实际需求灵活的使...
    99+
    2024-04-02
  • C++核心编程之内存分区详解
    目录1、内存分区模型:2、代码区:3、全局区:4、小结:5、代码演示:6、运行结果:总结1、内存分区模型: C++程序在执行时,将内存大方向划分成4个区域 (1)代码区:存放安徽念书...
    99+
    2024-04-02
  • C++程序的五大内存分区实例详解
    目录1、栈内存区1.1、调用函数时通过栈来传递函数的参数值       1.2、线程占用的栈内存是有上限的2、堆内存区3、全局/静态内存区4、...
    99+
    2024-04-02
  • C++ 面向对象程序设计--内存分区详解
    目录一、分区的意义二、代码区1、定义2、特点三、全局区1、定义2、特点3、相关代码1)全局变量2)静态变量四、栈区——程序运行后1、定义2、相关代码五、堆区——运行后1、定义2、相关...
    99+
    2024-04-02
  • Java运行时数据区域(内存划分)的深入讲解
    1. 程序计数器(线程私有) 程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器(切换线程后,能恢复到正确的执行位置). 2. Java虚拟机栈(线程私...
    99+
    2024-04-02
  • 详解C++内存的代码区,全局区,栈区和堆区
    目录代码区:全局区:栈区堆区总结今天无意中刷到了一篇关于c++内存的帖子,我发现那个人好像写的不太对,然后同时我自己也发现我对一块还不够了解,所以我干脆就自己去了解整理了一下:首先我...
    99+
    2024-04-02
  • 详解C语言动态内存的分配
    目录C 程序中,不同数据在内存中分配说明内存动态分配的相关函数应用实例动态分配内存的基本原则总结C 程序中,不同数据在内存中分配说明 1)全局变量——内存中的...
    99+
    2024-04-02
  • C++中内存池的简单原理及实现详解
    目录为什么要用内存池内存池原理内存池设计内存池实现为什么要用内存池 C++程序默认的内存管理(new,delete,malloc,free)会频繁地在堆上分配和释放内存,导致性能的损...
    99+
    2023-03-01
    C++内存池原理 C++实现内存池 C++内存池
  • 通俗易懂的C++前缀和与差分算法图文示例详解
    目录1、前缀和2、前缀和算法有什么好处?3、二维前缀和4、差分5、一维差分6、二维差分1、前缀和 前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀...
    99+
    2024-04-02
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • C++ 动态内存分配详解(new/new[]和delete/delete[])
    一、为什么需要动态内存分配? 在C++程序中,所有内存需求都是在程序执行之前通过定义所需的变量来确定的。 但是可能存在程序的内存需求只能在运行时确定的情况。 例如,当需要的内存取决于...
    99+
    2024-04-02
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2024-04-02
  • 详解利用C语言如何实现简单的内存池
    前言 在编程过程中,尤其是对于C语言开发者,其实编程就是在使用内存,不停地变化内存中的数据。当我们想开辟一片新的内存使用时,就会使用malloc实现。但是通过查阅很多资料,发现频繁的...
    99+
    2024-04-02
  • C语言中关于动态内存分配的详解
    目录一、malloc 与free函数二、calloc三、realloc四、常见的动态内存的错误【C语言】动态内存分配 本期,我们将讲解malloc、calloc、realloc以及f...
    99+
    2024-04-02
  • c++ class中成员与分配内存的问题详解
    目录1.内存补齐2.特殊情况--virtual函数3.不需要考虑的内存总结1.内存补齐 便于管理类(生成的对象)的内存,类总内存总是为最大成员字节大小的倍数,不足的会进行内存补齐 ...
    99+
    2024-04-02
  • 详解C语言在STM32中的内存分配问题
    01、前言 不说废话,先上示例代码 uint8_t num_byte[4]; uint32_t num_word; const uint32_t num_word_const =...
    99+
    2024-04-02
  • C++ 函数优化详解:如何优化内存分配?
    优化 c++++ 内存分配:使用内存池: 预先分配特定大小的对象,减少创建和销毁开销。使用对象池: 存储已创建对象,便于重用,避免频繁分配。使用自定分配器: 优化标准库分配器的行为。避免...
    99+
    2024-05-03
    c++ 内存优化 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作