c++中堆、栈、自由存储区和常量存储区(转)
代码段 --text(code segment/text segment)
text段在内存中被映射为只读,但.data和.bss是可写的。
text段是程序代码段,在AT91库中是表示程序段的大小,它是由编译器在编译连接时自动计算的,当你在链接定位文件中将该符号放置在代码段后,那么该符号表示的值就是代码段大小,编译连接时,该符号所代表的值会自动代入到源程序中。
数据段 -- data
data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。数据段属于静态内存分配。
bss段--bss
bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。BSS段属于静态内存分配。
stack:
栈(stack)保存函数的局部变量(但不包括static声明的变量, static 意味着 在数据段中 存放变量),参数以及返回值。是一种“后进先出”(Last In First Out,LIFO)的数据结构,这意味着最后放到栈上的数据,将会是第一个从栈上移走的数据。对于哪些暂时存贮的信息,和不需要长时间保存的信息来说,LIFO这种数据结构非常理想。在调用函数或过程后,系统通常会清除栈上保存的局部变量、函数调用信息及其它的信息。栈另外一个重要的特征是,它的地址空间“向下减少”,即当栈上保存的数据越多,栈的地址就越低。栈(stack)的顶部在可读写的RAM区的最后。
heap:
堆(heap)保存函数内部动态分配内存,是另外一种用来保存程序信息的数据结构,更准确的说是保存程序的动态变量。堆是“先进先出”(First In first Out,FIFO)数据结构。它只允许在堆的一端插入数据,在另一端移走数据。堆的地址空间“向上增加”,即当堆上保存的数据越多,堆的地址就越高。
区分堆与栈
void f(){ int* p=new int[4]; }
上面一条短短的一句话就包含了对于栈,看到new,就应该想到,分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中。
这里要释放内存的话不能用delete p,应该用delete[] p,这是为了告诉编译器:我删除的是一个数组。
堆、栈得主要差别如下:
1、管理方式:对于栈来讲,是由编译器自动管理,无需手动控制;对于堆来说,释放是由程序员控制,容易产生内存泄露。
2、空间大小:一帮来讲在32位系统下,堆内存可以达到4G的空间,在这个角度来看堆内存几乎是没有什么限制的。但是栈有一定的空间大小。
3、能否产生碎片:对于堆来讲,频繁的new、delete肯定会产生大量的空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲则不会存在这样的问题,因为栈是先进先出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出。
4、生长方向:对于堆来说讲,生长方向是向上的,也就是向着内存增长的方向;对于栈来说,它的生长的方向是向下的,是向着内存地址减小的方向增长的。
5、分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配有malloc函数进行分配,但是栈的动态分配和堆是不一样的,他的动态分配是由编译器进行释放,无需手动实现。
6、分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放的地址,压栈出栈都是有专门的指令执行,这就决定了栈的效率比较高。堆则是C++库提供的,它的机制是很复杂的,例如为内存分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够空间,如果没有足够大小的空间,就有可能调用系统区增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低的得多。堆大量使用new、delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请代价变得更加昂贵。
转载地址:http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014212.html、https://blog.csdn.net/love_gaohz/article/details/41310597
c++中堆、栈、自由存储区和常量存储区(转)的更多相关文章
- C++内存分区:堆、栈、自由存储区、全局/静态存储区和常量存储区
日志 ...
- (转)C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
程序在内存有五个存在区域: A:动态区域中的栈区 B:动态区域中的栈区 C:静态区域中:全局变量 和静态变量 (这个区域又可以进一步细分为:初始化的全局变量和静态变量 以及 未初始 ...
- c++ 堆、栈、自由存储区、全局/静态存储区和常量存储区
在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数 ...
- linux面试之--堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在须要的时候分配,在不须要的时候自己主动清除的变量的存储区.里面的变量一般是局部变量.函数參数等.在一个进程中.位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆 ...
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- 【校招面试 之 C/C++】第14题 C++ 内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区(堆栈的区别)
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...
- Java中 堆 栈,常量池等概念解析(转载)
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...
- 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
http://www.cnblogs.com/JCSU/articles/1051579.html 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序 ...
随机推荐
- (转)手把手图文教你eclipse下如何配置tomcat
转自:http://jingyan.baidu.com/article/ca2d939dd90183eb6d31ce79.html 很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置to ...
- 关于memcached
代振军 http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html http://www.cnblogs.com/daizhj/arch ...
- linux 环境安装及学习
一.Httpd Linux(Apache)Httpd服务器安装,启动及httpd.conf配置详解 https://blog.51cto.com/itwish/2160492 httpd-2.4. ...
- 跟哥走,带你玩转Surface 2
以为自己是数码控?觉得自己买了Surface就无所不能?别逗了!来看哥怎么玩平板,也让你们这些小虾米看看,什么才叫“玩转”! 新技能Get:密码不在用键盘 什么?每次开机你还要输入一长串密码?都什么年 ...
- Scala_控制结构
控制结构 if条件表达式 val x = 6 if (x>0){ println("This is a positive number") }else if(x== ...
- yum-阿里源配置
原文:https://opsx.alibaba.com/mirrorCentOS 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/ ...
- mantis邮件设置
1.cd /var/www/html/mantis 删除 config_inc.php 的$g_enable_email_notification = OFF; 重启httpd ...
- ?js调用PHP里的变量,怎么弄?
js调用PHP里的变量,怎么弄 网上给的例子都是js文件里一开始先给这个变量一个值,要是那样有啥意思啊,我要的就是可以变化的. hychyc_2008 | 浏览 2741 次 2013-04-18 ...
- python threading模块
#coding=utf-8 import threading from time import ctime,sleep def music(func): for i in range(2): prin ...
- Flash插件flashplugin-nonfree的手动更新
Debian,nonfree库里有flashplugin-nonfree,这个就是网页浏览器的Flash插件了.不过它好像不会自动更新,每次更新网页浏览器后都会提示flashplugin版本过低.但f ...