C/C++中栈(stack)&堆(heap)详解及其作用介绍

 更新时间:2021年09月02日 15:33:34   作者:我是小白呀  
这篇文章主要介绍了C/C++中栈(stack)&堆(heap)详解及其作用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

概述

栈 (stack) 是为执行线程流出的内存空间. 堆 (head) 是为动态分配预留的空间.

在这里插入图片描述

程序运行中的栈和堆

我们以一段代码来举例:

#include <iostream>
using namespace std;

int a = 0;  // 全局初始化区
char *pt;  // 全局未初始化

int main() {
    int b; // b在栈区
    char s[] = "abc";  // s在栈区
    char *p1;  // 在栈区
    char *p2 = "123";  // "123"在常量区, p3在栈区
    static int c = 0;  // 全局静态初始化区
    char *p3 = new char(65);  // 在堆区
    char *p4 = new char[10];  // 在堆区

    return 0;
}

在这里插入图片描述

  • 栈区: 栈区是分配局部变量的空间, 处于相对较高的地址. 栈地址向下增长
  • 堆区: 用于分配程序媛申请的内存空间, 是向上增长的
  • 静态数据区: 分配静态变量, 全局变量的空间
  • 只读区: 分配常量和程序代码

堆和栈的差异

在这里插入图片描述

申请方式和回收方式

栈: 栈上的空间是自动分配回收的. 生存周期只在函数的运行过程中, 运行后就释放.

堆: 程序媛根据需要自己申请的空间, 只要程序媛不释放空间, 就一直可以访问到. 一旦忘记释放会造成内存泄漏.

申请后系统的响应

栈: 只要栈的剩余空间大于所申请空间, 系统将为程序提供内存, 否则将报异常提示栈溢出. 响应速度快.

堆: 系统收到程序的申请时, 会遍历空闲内存地址的链表. 寻找第一个空间大于所申请空间的堆节点. 响应速度慢.

申请效率比较

栈: 由系统自动分配, 速度较快, 程序媛无法控制.

堆: 由 new 分配, 一般速度较慢, 而且容易产生内存碎片, 不过用起来最方便.

申请大小的限制

栈: 在 Windows 下, 栈的大小是 2MB. 如果申请的空间超过栈的剩余空间时, 将提示overflow
(栈溢出).

堆: 堆的大小受限于计算机系统中有效的虚拟内存. 堆获得的空间比较灵活, 也比较大.

堆和栈中的存储内容

栈: 函数调用语句的下一条可执行语句的地址, 函数的各个参数, 函数中的局部变量.

堆: 具体内容由程序媛, 我们安排.

注: 当有指针数据成员时, 必须用深复制, 使其使用堆区的空间.

到此这篇关于C/C++中栈(stack)&堆(heap)详解及其作用介绍的文章就介绍到这了,更多相关C++栈(stack)&堆(heap)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(237.删除链表的节点)

    C++实现LeetCode(237.删除链表的节点)

    这篇文章主要介绍了C++实现LeetCode(237.删除链表的节点),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言中find_package()的搜索路径的实现

    C语言中find_package()的搜索路径的实现

    本文主要介绍了C语言中find_package()的搜索路径的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 使用C++制作简单的web服务器

    使用C++制作简单的web服务器

    本文给大家分享的是使用C++简单实现web服务器的代码,虽然非常的简陋,功能也很少,主要是为了更好的理解WEB服务器的工作原理,推荐给大家,也希望对大家能够有所帮助。
    2015-03-03
  • C++ Boost Intrusive库示例精讲

    C++ Boost Intrusive库示例精讲

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++ 11新特性之大括号初始化详解

    C++ 11新特性之大括号初始化详解

    这篇文章主要介绍了C++ 11新特性之大括号初始化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-08-08
  • 带头结点单链表与不带头结点单链表的区别

    带头结点单链表与不带头结点单链表的区别

    这篇文章主要介绍了带头结点单链表与不带头结点单链表的区别,需要的朋友可以参考下
    2023-07-07
  • C++ OpenCV学习之图像像素值统计

    C++ OpenCV学习之图像像素值统计

    在图像分析的时候,我们经常需要对单通道图像的像素进行统计。本文将主要介绍利用C++ OpenCV实现的图像像素值统计的几种方法,需要的可以参考一下
    2022-01-01
  • C语言实现SM4加解密方式

    C语言实现SM4加解密方式

    这篇文章主要介绍了C语言实现SM4加解密方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • c++详细讲解构造函数的拷贝流程

    c++详细讲解构造函数的拷贝流程

    拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给函数。复制对象,并从函数返回这个对象
    2022-05-05
  • C语言各种符号的使用介绍上篇

    C语言各种符号的使用介绍上篇

    C 语言的基本符号就有 20 多个,每个符号可能同时具有多重含义,而且这些符号之间相互组合又使得 C 语言中的符号变得更加复杂起来
    2022-08-08

最新评论