热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/C++程序内存分布

一个完整程序,在内存中的分布情况:1、代码区(codearea)存放函数体(类成员函数、全局函数)的二进制代码。2、全局区(dataarea)静态存储区,存放全局变量、静态变

一个完整程序,在内存中的分布情况:

1、代码区(code area) 存放函数体(类成员函数、全局函数)的二进制代码。

2、全局区(data area) 静态存储区,存放全局变量、静态变量,初始化变量的在一块区域(低地址区域),未初始化变量在另一块区域(高地址区域BSS)。文字常量、字符串常量,程序结束后由系统释放。

3、堆区(heap area) 由低地址向高地址增长。一般new、malloc分配,由程序员分配和释放,分配方式类似于链表。

4、栈区(stack area)  由高地址向低地址增长。存放函数形参、局部变量、返回值等,由编译器自动分配、释放。

栈区再向下是操作系统和内核调用的一些内存地址

例:

int a = 0;//全局初始化区
char *p;//全局未初始化区
int main(void)
{
int b;//栈区
static int c = 0;//全局初始化区
char s[] = "abc";//栈区
char *p2;//栈区
char *p3 = "123";//栈区,123在常量区
p1 = new char[10];
p2 = new char[20];//分配的空间在堆区
strcpy(p1,"123");//123在常量区
return 0;
}


堆和栈的比较

1、申请方式  stack:由系统自动分配。比如在函数中一个局部变量 char a;系统自动在栈中为a开辟空间。heap:由程序员申请,并指定大小。p1 = new char[10]; p2 = (char *)malloc(10);

2、申请后系统的响应  stack:只要栈的剩余空间大于申请空间,系统将为程序提供内存,否则提示栈溢出。heap:操作系统有一个记录空闲内存地址的链表,当系统收到程序申请时,会遍历链表,寻找第一个空间大于申请空间的堆结点,然后将结点从空闲地址链表中删除,将结点的空间分配给程序,多余的空间会重新放入空闲链表中。

3、申请的大小限制  stack:windows中,栈向低地址扩展,连续的内存区域,大小一般是2M(编译器)。heap:堆向高地址扩展,不连续的内存区域,由空闲内存链表管理,大小受限于系统中有效的虚拟内存。

4、申请效率stack:栈由系统自动分配,速度快。heap:堆由new/malloc函数分配,速度较慢,容易产生内存碎片,方便。

5、存取效率 xx  栈上的数组比指针所指向的字符串快。

6、存取内容  stack:函数调用时,第一个进栈的是函数调用语句的下一条指令的地址,然后是函数的参数从右往左入栈(编译器),再是局部变量入栈。函数调用结束后,局部变量出栈,参数出栈,栈顶指针指向函数调用的下一条指令,程序继续运行。heap:堆的头部用一个字节存放堆的大小,具体内容由程序员决定。


堆和栈的区别:

1、管理方式不同;堆由程序员控制,容易产生memory leak,栈由编译器自动管理

2、空间大小不同;堆空间可以达到4G,栈有一定的空间大小,一般是2M。

3、生长方向不同;堆的生长方向->向着内存地址增加的方向增长,栈的生长方向->向着内存地址减小的方向增长。

4、分配方式不同;堆是动态分配的。栈有静态分配和动态分配。

5、分配效率不同;堆是C/C++函数库提供的,机制复杂,根据一定的算法实现。栈是机器系统提供的,在低层有专门的寄存器和栈指令,效率高。堆的效率比栈低得多。

6、能否产生碎片不同对于堆,频繁的使用new/delete会造成内存空间不连续,产生大量碎片。对于栈,不会存在这个问题,先进后出。

堆和栈相比,由于大量的new/delete的使用,容易造成大量的内存碎片,效率低等因素,推荐使用栈。但是堆更加的灵活,在分配大量的空间时,堆才是更好的选择。无论是堆还是栈,都要防止越界现象的发生(程序崩溃、破坏堆栈结构)。


new/delete 和 malloc/free

new分配空间会调用类的构造函数,而malloc函数仅仅是一个函数调用。delete在释放堆空间的时候会调用析构函数,而free函数不会。



推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
被爱的善良的小鸽_212
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有