静态存储区、栈区、堆区的区别

news/2024/5/20 9:54:39 标签: 内存分配方式, , , 静态存储区
内存分配有三种:静态存储区区和区。他们的功能不同,对他们使用方式也就不同。


静态存储区内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。
区:在执行函数时,函数(包括main函数)内局部变量的存储单元都可以在上创建,函数执行结束时这些存储单元自动被释放。内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(任何变量都处于站区,例如int a[] = {1, 2},变量a处于区。数组的内容也存在于区。)
区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,并立即将指针置位NULL,防止产生野指针。


的主要区别由以下几点: 
  1、管理方式不同; 
  2、空间大小不同; 
  3、能否产生碎片不同; 
  4、生长方向不同; 
  5、分配方式不同; 
  6、分配效率不同; 
*****************************************************************************************************************

  1、管理方式:对于来讲,是由编译器自动管理,无需我们手工控制;对于来说,释放工作由程序员控制,容易产生memory leak。 


  2、空间大小:一般来讲在32位系统下,内存可以达到4G的空间,从这个角度来看内存几乎是没有什么限制的。但是对于来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的空间大小是1M(好像是,记不清楚了)。当然,我们可以修改: 打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定的最大值和commit。 注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使开辟较大的值,可能增加内存的开销和启动时间。 


  4、碎片问题:对于来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于来讲,则不会存在这个问题,因为是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从中间弹出,在他弹出之前,在他上面的后进的内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。 


  5、生长方向:对于来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。 


  6、分配方式:都是动态分配的,没有静态分配的有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是的动态分配和是不同的,它的动态分配是由编译器进行释放,无需我们手工实现。 


  7、分配效率:是机器系统提供的数据结构,计算机会在底层对提供支持:分配专门的寄存器存放的地址,压都有专门的指令执行,这就决定了的效率比较高。则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,的效率比要低得多。

******************************************************************************************************************
  从这里我们可以看到,相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以在程序中是应用最广泛的,就算是函数的调用也利用去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用的方式存放。所以,我们推荐大家尽量用,而不是用。 虽然有如此众多的好处,但是由于和相比不是那么灵活,有时候分配大量的内存空间,还是用好一些。 


    无论是还是,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的结构,产生意想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的)


http://www.niftyadmin.cn/n/1022389.html

相关文章

117、状态码301,302,304的区别

301:永久性重定向。从网址A重定向到B后,旧地址A的资源已经被永久地移除了;比如你的网站从 HTTP 升级到了 HTTPS 了,以前的站点再也不用了,应当返回301;302:临时重定向。旧地址A的资源还在&#…

服务器证书安装配置指南(Jboss)

一、 生成证书请求 1. 安装JDK 安装Tomcat需要JDK支持。如果您还没有JDK的安装,则可以参考 Java SE Development Kit (JDK) 下载。下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 2. 生成keystore文件 生成密钥库文…

C++11 线程

C11 新标准中引入了四个头文件来支持多线程编程&#xff0c;他们分别是<atomic>,<thread>,<mutex>,<condition_variable>和<future>。 <atomic>&#xff1a;该头文主要声明了两个类, std::atomic和 std::atomic_flag&#xff0c;…

118、数据结构中数组、链表、哈希

一、数组 在内存中&#xff0c;数组是一块连续的区域。数组需要预留空间&#xff0c;在使用前要先申请占内存的大小&#xff0c;可能会浪费内存空间。插入数据和删除数据效率低。除了在尾部的插入删除。插入数据时&#xff0c;这个位置后面的数据在内存中都要向后移。删除数据…

C++11 多线程同步

多线程能提高程序的效率&#xff0c;但同时也带来了相应的问题----数据竞争。当多个线程同时操作同一个变量时&#xff0c;就会出现数据竞争。出现数据竞争&#xff0c;一般会用临界区&#xff08;Critical Section&#xff09;、互斥量&#xff08;Mutex&#xff09;、信号量&…

顺丰菜鸟之争!物流APP开发亟待提升末端服务问题

马云说&#xff1a;“我告诉大家&#xff0c;一天10亿只包裹&#xff0c;不会超过8年&#xff0c;估计在六七年左右就能实现。” 马云曾毫不留情的批判&#xff0c;目前还没有看到哪家公司&#xff0c;在眼光、格局、组织、人才、技术各方面都做好了准备&#xff0c;迎接10亿包…

119、手动实现图片懒加载

js实现图片懒加载原理_tomorrownan的博客-CSDN博客_懒加载 vue懒加载实现及其原理_Mrcaolei的博客-CSDN博客_vue懒加载的原理及实现

标准c++中string类函数介绍

标准c中string类函数介绍之所以抛弃char*的字符串而选用C标准程序库中的string类&#xff0c;是因为他和前者比较起来&#xff0c;不必 担心内存是否足够、字符串长度等等&#xff0c;而且作为一个类出现&#xff0c;他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需…