Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6276185
  • 博文数量: 2759
  • 博客积分: 1021
  • 博客等级: 中士
  • 技术积分: 4091
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-11 14:14
文章分类

全部博文(2759)

文章存档

2019年(1)

2017年(84)

2016年(196)

2015年(204)

2014年(636)

2013年(1176)

2012年(463)

分类: LINUX

2013-03-25 03:06:10

原文地址:UNIX简单内存结构介绍 作者:ygfinsight

 
硬件层次
     内存结构管理
内核层次
     内存映射
     堆扩展
语言层次
     c:malloc 
       c++:new
数据结构层次
     STL
     智能指针
1.问题
     malloc怎么分配空间?
     malloc与new 的关系?
2.Linux对内存的管结构描述
    1. /proc/${pid}/ 存放进程运行时候所有的信息(包括内存结构)
ps aue:查看所有用户的有效进程
cat maps:运行程序的内存结构

结论:
     任何程序的内存空间分成4个基本部分
     1.代码区 
     2.全局栈区
     3.堆
     4.局部栈
#include:unix标准头文件
2.理解程序的变量与内存空间的关系
     结论:
          1.内存分为四个区。
          2.各种变量对应存放区
          3.堆栈是一种管理内存的数据结构
          4.查看程序的内存地址
3.理解malloc 的工作原理
          malloc 使用一个数据结构(链表)维护我们分配的空间,链表的构成:
分配的空间/上一个空间数据/下一个空间数据
对malloc 分配的空间不要越界访问,因为容易破坏后台的维护结构,导致

4.c++的new与malloc的关系
          malloc           new      new[]
          realloc           new(void*):定位分配:char a[20];int *p=new(a) int;//指定从a处分配
 与realloc一样,形式不同而已
          calloc            new[]  
          free                delete    delete[]
结论:new的实现使用malloc来实现
     区别:new使用malloc后,还要初始化空间,基本类型,直接初始化成默认值
               UDT类型,调用制定构造器
     delete调用free实现。
          delete负责先调用析构器,然后再调用free。
new与new[]区别
     new只调用一个构造器初始化,new[]循环对每一个区域调用构造器
delete与delete[]区别

程序运行时内存布局:
text 代码段:存放可执行程序 data/bss数据段:存放全局数据,静态全局数据,全局常量
heap堆:
stack栈:函数,函数形参,非静态局部变量,函数返回地址,寄存器变量register
环境数据:

getpagesize():取得内存一页的大小
void* sbrk():调整终点,返回原来的终点。
int brk();指定新的终点:用完后的第一个
void*alloca(size_t size):在栈里分配内存
void* malloc(size);
内存分配不联系的原因:分配内存的同时,还要一部分空间存储控制信息
realloc(p4,0);//free(p4)
mmap:内存映射
阅读(1287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~