内存分配的形式

原创 2016年08月29日 09:23:09
一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容:


1) 由符号起始的区块(Block Started by Symbol, BSS)段:BSS段属于静态内存分配,通常是指用来存放程序未初始化的全局数据和静态数据的一块内存区域。程序结束后由系统自动释放。

2)数据段(data segment)全局变量的:数据段属于静态内存分配。通常是指用来存放程序中已初始化的全局变量的一块内存区域。


3) 代码段(code segment/text segment):代码段有时候也叫文本段,通常指用来存放程序执行代码(包括类成员函数和全局函数以及其它函数代码)的一块内存区域,这部分区域的大小在程序运行前就已确定,并且内存区域通常是只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量。这个段一般是可以共享的。


4)堆(heap):堆用来存放进程中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。堆一般由程序员分配释放,若程序员不释放。


5)栈(stack):栈是用户存放程序临时创建的局部变量。由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。


堆和栈的区别:

1)空间大小不同:一般来讲在32位内存下,堆内能够达到4G的空间,但是对于栈来讲,一般都是有一定的空间大小的。

2)分配方式不同:堆是动态分配的,没有静态分配的堆。栈有静态分配和动态分配。静态分配由编译器完成的,动态分配由alloca函数进行分配

3)  生长方式不同:对于堆来说,生长方向是向上的,也就是向着内存地址增加的方向,不连续的一块内存区域。对于栈来说,生长方向是向下的,是向着内存地址减小的方向增长,是一块连续的内存区域。

4)管理方式不同:对于栈来说,内存的分配和释放是由编译器来自动管理。对于堆来说,由程序员手动释放,而且容易产生内存泄漏

5)碎片问题不同:对于堆来说,频繁的new/delete势必造成内存空间的不连续,从而造成大量的碎片,使效率降低。对于栈来说,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于不可能有一个内存块从栈中间弹出,在它弹出之前,在他上面后进的栈内容已被弹出。

6) 分配效率不同:栈是机器系统提供的数据结构,电脑会在底层对栈提供支持:分配专门的寄存器放栈的地址,压栈入栈都有专门的指令执行,这就决定了栈的效率表较高。

堆是C/C++ 函数库提供的,机制是很复杂的,例如分配一块内存,库函数会按照一定的算法在堆内存中搜索可用的足够大小的空间,假如没有足够大小的空间,就有可能调用系统功能区增加程式数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。


内存的基本单位是字节。

堆和栈的区别可以用如下的比喻来看出: (转载)    
  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就  
  走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自  
  由度小。    
  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由  
  度大。  



安卓中的几种形式的通知

主布局文件:
  • my_worldlet
  • my_worldlet
  • 2015年09月16日 21:51
  • 722

《自然语言计算机形式分析的理论与方法》读书笔记(3-1)

第三章 基于短语结构语法的形式模型(一)最为广泛的是短语结构语法PSG大佬合影!(http://blog.sina.com.cn/s/blog_72d083c70100o8m8.html) (左:冯...
  • hermanncain
  • hermanncain
  • 2017年07月04日 15:35
  • 342

最小二乘法(一般形式和矩阵形式)

 转自:作者:金良(golden1314521@gmail.com) csdn博客:http://blog.csdn.net/u012176591 1.线性代数模型 首先给出最小二乘...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015年05月17日 21:38
  • 10021

多态的四种不同形式

在收到消息时,对象要予以响应。不同的对象收到同一消息可以产生完全不同的结果,这一现象称为多态。在使用多态的时候,用户可以发送一个通用的消息,而实现的细节由接收对象自行决定。这样,同一消息就可以调用不同...
  • u010104750
  • u010104750
  • 2015年11月03日 08:26
  • 1319

《自然语言计算机形式分析的理论与方法》读书笔记(2)

第二章 语言计算研究的先驱 介绍了马尔可夫链、信息熵、范畴语法自然语言模型,并对提出者们进行了简介...
  • hermanncain
  • hermanncain
  • 2017年07月03日 21:47
  • 540

统计学习方法(2)——感知机原始形式、对偶形式及Python实现

感知机作为一种最简单的线性二分类模型,可以在输入空间(特征空间)将实例划分为正负两类。本文主要介绍感知机两种形式对应的学习算法及Python实现。 感知机学习算法的原始形式对于输入空间,感知机通过以下...
  • winter_evening
  • winter_evening
  • 2017年04月16日 16:07
  • 2322

数理逻辑考试题目分析

数理逻辑考试题目分析 中科院
  • Arabela35
  • Arabela35
  • 2016年12月11日 23:49
  • 497

java几种类的形式以及接口的形式

Java基础
  • Zhan9b0
  • Zhan9b0
  • 2016年10月09日 14:52
  • 371

Android 分享文本和图片

Android中分享内容的方式很多,有时需要同时分享文字内容和图片,下面是图文分享的关键代码: /** * 图文分享 * * @param imgPath * ...
  • wupuquan
  • wupuquan
  • 2013年10月10日 12:12
  • 2823

《自然语言计算机形式分析的理论与方法》读书笔记(1)

我国自然语言处理泰斗冯志伟教授所著《自然语言计算机形式分析的理论与方法》是我国基于规则的自然语言处理方法的集大成之作。本书第一章为自然语言处理的学科定位,冯教授从过程、范围和历史三个方向分析了自然语言...
  • hermanncain
  • hermanncain
  • 2017年07月03日 12:35
  • 338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存分配的形式
举报原因:
原因补充:

(最多只允许输入30个字)