《Unix环境系统高级编程》中的C语言内存分布示意图

1.C内存分布

BSS段: 用来存放程序中未初始化的全局变量。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:用来存放程序中已初始化的全局变量。数据段属于静态内存分配。

代码段:用来存放程序执行代码。

堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等

函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)

栈:栈又称堆栈, 存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外

,在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。

2.C++内存分布

a) 栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。

b) 堆:内存使用new进行分配使用delete或delete[]释放。如果未能对内存进行正确的释放,会造成内存泄漏。但在程序结束时,会由操作系统自动回收。

c) 自由存储区:使用malloc进行分配,使用free进行回收。和堆类似。

d) 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,C语言中区分初始化和未初始化的,C++中不再区分了。

e) 常量存储区:存储常量,不允许被修改。

3.区分栈和堆

a) 管理方式:栈由编译器管理,堆由程序员控制。

b) 空间大小:VC下栈默认是1MB,堆在32位的系统上可以达到4GB。

c) 碎片问题:栈不会产生碎片,堆会产生碎片。

d) 生长方向:堆向着内存地址增加的方向增长,栈向着内存地址减少的方向增长。

e) 分配方式:堆是动态分配的。栈是静态分配和动态分配的,静态分配由编译器完成,动态分配由alloca函数进行分配,由编译器释放。

f) 分配效率:栈的分配效率非常高。堆的分配机制很复杂,效率比栈要低得多。

4.malloc的实现

  http://www.ibm.com/developerworks/cn/linux/l-memory/

5. C++智能指针

a) auto_ptr: C++03标准,方便管理单个堆对象的内存,不能配合容器使用,赋值操作会转移指针所有权,release()会交出指针所有权。

b) unique_ptr: C++11标准,方便管理堆对象或者堆对象数组的内存,一旦初始化,不会再交出指针所有权,可以避免很多错误的实践。

c) shared_ptr:C++11标准,方便管理需要共享所有权的内存,可以配合容器使用,可以用在参数传递的过程。

d) weak_ptr:C++11标准,weak_ptr是shared_ptr的观察者,负责从shared_ptr产生一个weak_ptr但是不会增加引用计数,当shread_ptr失效以后,weak_ptr也会失效。

e) 如何选择:不要使用auto_ptr,不要使用裸指针,局部变量使用unique_ptr需要传递和共享的指针使用shared_ptr。

C && C++ 内存分配示意图的更多相关文章

  1. Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  2. Java内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  3. Java内存分配全面浅析(转)

           原文引自CSDN:        本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个 ...

  4. 【转载】Java 内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 本文转载自袭烽大神的博客,原文链接 ...

  5. Java 内存分配全面浅析(转)

    本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java.这类文章网上有很多,但大多比较零碎.本文从认知过程角度出发,将带给读者一个系统的介绍. 进入正题前首先要知道的是Java程 ...

  6. Java 内存分配(转)

    Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性. 寄存器:JVM内部虚拟寄 ...

  7. [转载]Java 内存分配全面浅析

    Java 内存分配全面浅析 2013-02-20 17:54:45 袭烽 阅读数 91353更多 分类专栏: java基础   本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Ja ...

  8. 01 Java 内存分配全面浅析

    http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析  本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...

  9. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

随机推荐

  1. C语言知识总结(2)

    选择结构-if if(表达式) {} {}为作用域 多重if-else  例如: #include <stdio.h> int main(){ ; ){ printf("没有购物 ...

  2. 1.配置EditPuls-编译和运行java程序

    1.工具>配置自定义工具 2.添加工具>程序 1).编译java程序 2).运行java程序

  3. gcc与g++的区别

    一:gcc与g++比较 编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而 c++代码用g++,或者说编译用gcc,链接用g++,一时也不知哪个说法正确, ...

  4. C++向main函数传递参数的方法(实例已上传至github)

    通常情况下,我们定义的main函数都只有空形参列表: int main(){...} 然而,有时我们确实需要给mian传递实参,一种常见的情况是用户设置一组选项来确定函数所要执行的操作.例如,假定ma ...

  5. EF调用函数日期查询

    q = q.Where(t => System.Data.Entity.SqlServer.SqlFunctions.DateDiff("dd", t.Date, dDate ...

  6. 阿里云服务器 ECS Ubuntu系统安装配置

    1. 登陆服务器 系统开通成功后手机会收到阿里云发来的短信,包含公网IP及root登录密码. WEB管理后台方式 可通过阿里云管理后台选择“连接管理终端…”进行登录 提示输入VNC密码 登录成功后显示 ...

  7. Objective-C中字典的使用方法总结

    在Objective-C中提供了两个类来实现字典,即NSDictionary和NSMutableDictionary.其中,NSMutableDictionary是NSDictionary的子类,它继 ...

  8. ECMAScript整理笔记(持续更新....)

    参考文献: ECMAScript Array:http://www.jimmycuadra.com/posts/ecmascript-5-array-methods ECMAScript5兼容展示大全 ...

  9. php获取服务器时间的代码

    php获取服务器时间的代码. 用php的date函数即可来获取服务器上的时间:  <?php //将时区设置为中国 date_default_timezone_set("PRC&quo ...

  10. 【linux】iptables 开启80端口

    经常使用CentOS的朋友,可能会遇到和我一样的问题.开启了防火墙导致80端口无法访问,刚开始学习centos的朋友可以参考下. 经常使用CentOS的朋友,可能会遇到和我一样的问题.最近在Linux ...