【Linux_Unix系统编程】chapter7 内存分配
Chapter7 内存分配
本章将用于在堆或者栈上分配内存的函数。
7.1 在堆上分配内存
通常将堆的当前的内存边界称为"program break"
7.1.1 调整program break: brk()和sbrk()
改变堆的大小(即分配或者释放内存),其实就像命令内核改变进程的program break位置一样简单。
传统的UNIX系统提供了两个操纵program break的系统调用:brk()和sbrk().
#include <unistd.h>
int brk(void *end_data_segmeng);
void *sbrk(intptr_t increment);
7.1.2 在堆上分配内存:malloc()和free()
一般情况下,C语言使用malloc函数族在对上分配和释放内存。比较brk()和sbrk(),具有以下优点
(1):属于C语言标准部分
(2):更易于在多线程中使用
(3):接口简单,允许分配小块内存
(4):允许随意释放内存块,他们被维护在于一个空闲的内存列表中,在后续内存分配调用是循环使用。
#include <stdlib.h>
void *malloc(size_t size);
malloc()返回内存块所采用字节对齐方式,总是适用于高效访问任何类型的C语言数据结构。在大多数硬件结构上,这意味着malloc是基于8字节或16字节边界来分配内存的。
free()函数释放ptr参数所指向的内存块,该参数应该是之前由malloc().
#include <stdlib.h>
void free(void *ptr);
7.1.3 malloc()和free()的实现
malloc()调试的工具和库
7.1.4 在堆上分配内存的其他方法
用calloc()和realloc()分配内存
#include <stdlib.h>
void *calloc(size_t numitms, size_t size);
numitms:指定分配对象的数量
size:指定每个对象的大小
注意:calloc()会将分配的内存初始化为0,而malloc()返回的是为初始化的内存空间。
eg:
struct { /**/}myStruct;
struct myStruct *p;
p = calloc(1000, sizeof(struct myStruct));
if(p == NULL)
errExit("calloc");
realloc()函数用来调整(通常是增加)一块内存的大小,而此块内存应该是之前由malloc包中函数所分配的。
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
realloc()增加了已分配的内存块的大小,则不会对额外分配的字节进行初始化。
使用calloc() 和realloc()分配的内存应使用free()来释放。
分配对齐的内存:memalign()和posix_memalign()
目的:在分配内存的时候,起始地址要与2的整数次幂边界对齐。
#include <malloc.h>
void *memalign(size_t boundary, size_t size);
作用:分配size个字节的内存,起始地址的参数boundary的整数倍,而boundary必须是2的整数次幂。
posix_memalign(),该函数由标准委员会于近期创建,只是出现在了少数UNIX实现上。
#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
7.2 在堆栈上分配内存:alloca()
alloca()也可以动态分配内存,不过不是从堆上分配内存,而是通过增加栈帧的大小从堆栈上分配。
#include <alloca.h>
void *alloca(size_t size);
注意:不需要(实际上也决不能)调用free()来释放由alloca分配的内存。同样也不能调用realloc()来调整由alloca()分配的内存大小。
不能再一个函数的参数列表中调用alloca().
【Linux_Unix系统编程】chapter7 内存分配的更多相关文章
- 【Linux_Unix系统编程】chapter6 进程
chapter6 进程 重点关注进程虚拟内存的布局及内容.6.1 进程和程序 进程(process)是一个可执行程序(program)的实例. 程序是包含了一系列信息的文件,这些信息描述了如何在运行时 ...
- 【Linux_Unix系统编程】Chapter4 文件IO
Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ...
- 【Linux_Unix系统编程】Chapter10 时间
chapter10 时间 1:真实时间:度量这一时间的起点有二:(1)某个标准点:(2)进程生命周期内的某个固定时点(通常为程序启动) 2:进程时间:一个进程所使用的CPU时间总量,适用于对程序,算法 ...
- 【Linux_Unix系统编程】Chapter9 进程凭证
chapter9 进程凭证 每个进程都有一套用数字表示的用户ID(UID)和组ID(GID).有时也将这些ID称子为进程凭证. 1:实际用户ID和实际组ID 2:有效用户ID和有效组ID 3:保存的s ...
- 【Linux_Unix系统编程】Chapter8 用户和组
chapter8 用户和组 8.1 密码文件 /etc/passwd 每行都包含7个字段,之间用冒号分割,如下所示: mtk:x:1000:100:Michael:/home/mtk:/bin/bas ...
- 【Linux_Unix系统编程】chapter5 深入探究文件IO
Chapter5 深入探究文件I/O 本章节将介绍另一个与文件操作相关的系统调用:多用途的fcntl(),并展示其应用之一读取和设置打开文件的状态标志. 5.1 原子操作和竞争条件 所有系统调用都是以 ...
- Linux系统编程 —共享内存之mmap
共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备.但是它没有自带同步机制,需要配合信号量等方式来进行同步. 共享内存被创建以后,同一块物理内存被映射到了 ...
- Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)
Win内存分配函数(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc) 来源:http://blog.csdn.net/chunyexiyu/article/ ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
随机推荐
- Linux 系统信息查询
众所周知,Linux大部分操作是通过命令实现的,并不像windows那么直观.linux查看硬件信息也是需要通过linux查看硬件信息命令查询的,下面小编来分享一下linux查看硬件信息的方法和命令写 ...
- Python: PS 图像调整--明度调整
本文用 Python 实现 PS 图像调整中的明度调整: 我们知道,一般的非线性RGB亮度调整只是在原有R.G.B值基础上增加和减少一定量来实现的,而PS的明度调整原理还得从前面那个公式上去找.我们将 ...
- HDU 3998
http://acm.hdu.edu.cn/showproblem.php?pid=3998 求LIS的长度,并且求有多少组互不相交的LIS 求组数用最大流 建图如下: if(dp[i]==1)add ...
- ubuntu16.04-caffe安装过程详解-草稿
前言 目前主要模块都是基于深度学习展开的,虽然知道一些深度学习的基础知识,只是皮毛,还没有使用深度学习框架练手甚至深入,故开始着手深度学习的实操和深入学习. 操作步骤 参考 1.Ubuntu16.04 ...
- python 正则表达式 提取网页中标签的中文
转载请注明出处 http://www.cnblogs.com/pengwang52/. >>> p= re.compile(r'\<div class="commen ...
- .NET 中什么样的类是可使用 await 异步等待的?
我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类.接口或者方法属性能够告诉我们与 await 相关. 而本文将探索什么样的类是可使用 await 异步等待的? D ...
- poj2253 最短路
题意:青蛙跳石头,给出石头的坐标,然后要确定一条路径,使路径上的最大跨度最小,其实也是一道最短路问题,只要将更新条件从总距离最短改为最大跨度最小就行,即从某点到当前点路径上的最大跨度如果小于当前点原本 ...
- Maps.newHashMapWithExpectedSize(2)
☆ Map<String, Object> diffQuota = Maps.newHashMapWithExpectedSize(2); Maps.newHashMapWithExpec ...
- jquery选择器总结2
1.JQuery的概念 JQuery是一个JavaScript的类库,这个类库集合了很多功能方法,利用类库你可以用一些简单的代码实现一些复杂的JS效果. 2.JQuery实现了 代码的分离 不用再网页 ...
- 实习第二天-今年第一场雨-方法的重载(马上想到println()函数和abs(函数))
在C语言中 调用函数abs()返回一个整数的绝对值, fabs(返回一个单精度浮点型的绝对值)若要返回这些数的绝对值,则必须记住这些函数的名字 java可以用方法的重载:即是方法名必须相同,参数必须不 ...