一、共享库
共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本。程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函数相链接,这减少了每个可执行文件的长度,但增加了一些运行时间开销。另一个优点就是可以用库函数的新版本来替换老版本而无需对该库的程序重新链接编译。
不同的系统使用不同的方法说明程序是否需要使用共享库。比较典型的有cc和ld命令的可选项。
二、 存储器分配
ANSI C说明了三个存储空间动态分配的函数
(1) malloc。分配指定字节数的存储区。此存储区中的初始值不确定。 (2) calloc。在内存中动态地分配nobj个长度为size的连续空间。该空间中的每一位都初始化为0。 (3) realloc。更改以前分配区的长度(增加或减少)。当增加长度时,可能需要将以前分配区的内容移到另一个足够大的区域,而且新增区域内的初始值不确定。
#include <stdlib.h>void *malloc(size_t size);void *calloc(size_t nboj, size_t size);void *realloc(void *ptr, size_t newsize); 三个函数返回:成功返回为非空指针,出错为NULLvoid free(void *ptr);
这三个分配函数返回的指针一定是适当对齐的,使其可以用于任何数据对象。在一个特定的系统上,如果最苛刻的对齐要求是double,则对齐必须在8的倍数的地址单元处,那么这三个函数返回的指针都应这样对齐。 free函数释放的空间通常被送入可用存储区池,以后可在调用分配函数时再调用。 realloc如果在原存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充。并返回传给它的同样的指针值。如果在原存储区后没有足够的空间则realloc分配一个足够大的存储区,将现存的内容复制到新分配的存储区中。因为这种存储区会移动位置所以不应使任何指针指到该区。 realloc的最后一个参数是存储区的newsize而不是新旧长度之差。如果ptr是空指针,则realloc功能与malloc相同。用于分配一个制定长度newsize的存储区。
这些分配例程通常通过sbrk系统调用实现。该系统调用扩充或缩小进程的堆。
虽然sbrk可以扩充或缩小一个进程的存储空间,但是大多数malloc和free的实现都不减小进程的存储空间而是将它们保存在malloc池中而不返回给内核。
大多数实现所分配的存储空间比所要求的要大,额外的空间用来记录管理信息--分配块
