IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++学习12_C++内存分配方式 -> 正文阅读

[C++知识库]C++学习12_C++内存分配方式

引言

现在的应用程序都运行在一个虚拟内存空间里,以32位系统为例,其寻址空间为4G。

大部分的操作系统为4G内存空间,一般分为两个部分:

  1. 内核态空间(应用程序无法直接访问),Linux默认将高地址的1G空间分配给内核态空间,
  2. 用户态空间(用户使用),剩下的低地址的3G内存空间为用户态空间。

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


C/C++程序内存空间分布(用户态空间)

  1. 栈区(stack):由编译器自动分配与释放,存放函数参数、局部变量、返回数据、返回地址等。其操作类似于数据结构中的栈。
  2. 堆区(heap):由程序员手动分配与释放,若程序结束时未释放,可能由OS(Operating System)回收。其分配类似于链表。
  3. 全局区/静态区(static):存放全局变量、静态变量和常量。程序分配时由系统分配,程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
  4. 常量区(文字常量):存放常量字符串,由系统分配与释放。
  5. 代码区:存放函数体的二进制代码(类成员函数和全局区)。

栈(stack)与堆(heap)的区别:(6个方面)

  1. 管理方式不同。

    **堆:**由程序员申请与释放,容易产生memory leak.

    **栈:**是由编译器自动管理,无需程序员手动控制;

  2. **空间大小不同。**一般在32位系统下,

    **堆内存:**几乎没有限制的,最大可以到4G。

    **栈内存:**一般有空间大小限制,例如,在VS下,默认的栈空间大小是1M。

  3. **分配方式不同。**内存有2种分配方式:静态分配和动态分配。

    **堆:**全部都是动态分配内存,没有静态分配的堆,由malloc, calloc函数进行分配。

    **栈:**多数都是静态分配内存,由编译器完成,如分配局部变量。但是栈的动态分配和堆不同,由编译器动态分配与释放,无需程序员手动实现。

  4. 生长方向不同。

    **堆:**向上生长(内存地址增加);

    **栈:**向下生长(内存地址减小)。

  5. 是否产生碎片。

    **堆:**频繁的(malloc/free)(new/delete)会造成内存空间的不连续,从而产生大量碎片,降低程序效率。

    **栈:**栈是先进后出,一个内存块从栈中间弹出之前,在它上面的后进的栈内容已经被弹出,故不会产生碎片问题。

  6. 分配效率不同

    **堆:**由库函数提供(malloc/free)(new/delete),机制复杂,速度较慢。

    栈:是系统提供的数据结构,由系统自动分配,速度较快。

转自(原文链接):https://blog.csdn.net/cherrydreamsover/article/details/81627855


区分概念与使用:(简单了解即可)

全局变量与静态全局变量:

  1. 都属于常量区
  2. **全局变量:**在别的文件中可以调用;**静态全局变量:**只在本文件中有效,别的文件无法调用该变量。
  3. 若在另一文件中定义一个同名全局变量,会出错。

局部变量与静态局部变量:

  1. **函数内部局部变量:**属于栈区;**静态局部变量:**属于常量区的。
  2. **局部变量:**会随该函数的结束而结束;**静态局部变量:**不会随函数的结束而销毁,而是随整个程序结束而结束,但别的函数无法调用该变量,;
  3. 若这两个变量未给初值,会被自动定义。**局部变量:**随机值;**静态局部变量:**0。
  4. **局部变量:**在调用期间,每调用一次,赋一次值。**静态局部变量:**只在编译期间赋值一次,以后函数每次调用,不再赋值。

转自(原文链接):https://blog.csdn.net/cherrydreamsover/article/details/81627855

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:24:29  更:2022-04-26 11:26:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:18:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码