内存分配的形式

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


内存的基本单位是字节。

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



相关文章推荐

程序员求职之道(《程序员面试笔试宝典》)之程序设计基础(内存分配形式)?

一个C/C++编译的程序所占用的系统内存一般分为以下几个部分的内容: (1)由符号启始的区块(Block Started by Symbol, BSS)段:BSS段通常是指用来存放程序中未初始化的全局...
  • xdhehao
  • xdhehao
  • 2012年08月18日 21:54
  • 1364

内存分配的形式有哪些

转载请注明: 转载自新书《程序员面试笔试宝典》官网

android模拟内存分配

  • 2016年07月15日 15:35
  • 20.84MB
  • 下载

物理内存分配

  • 2015年03月29日 17:27
  • 13KB
  • 下载

从内存分配角度分析c和java里的static 关键字.

即使作为Java的初学者, 对this 和 static 这两个关键字都不会陌生. 其实也不难理解:     this 关键字:  指的是对象的本身(注意不是类本身)  跟.net 语言的Me 关键字...
  • nvd11
  • nvd11
  • 2013年12月30日 00:05
  • 1673

11_内存分配 视频

  • 2016年03月24日 18:29
  • 22.49MB
  • 下载

动态内存分配

  • 2015年05月14日 11:39
  • 151KB
  • 下载

动态数组与普通数组在内存分配上的区别

// // main.cpp // test // // Created by Cong on 13-3-24. // Copyright (c) 2013年 liuchyin. All ri...

C++程序内存分配讲解

  • 2016年01月03日 01:04
  • 40.6MB
  • 下载

Oracle内存分配与调整

  • 2014年09月11日 12:52
  • 181KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内存分配的形式
举报原因:
原因补充:

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