一、共享庫

  共享庫使得可執(zhí)行文件中不再需要包含常用的庫函數(shù),而只需在所有進(jìn)程都可存取的存儲區(qū)中保存這種庫例程的一個副本。程序第一次執(zhí)行的時候或第一次調(diào)用某個庫函數(shù)的時候,用動態(tài)鏈接方法將程序與共享庫函數(shù)相鏈接,這減少了每個可執(zhí)行文件的長度,但增加了一些運行時間開銷。另一個優(yōu)點就是可以用庫函數(shù)的新版本來替換老版本而無需對該庫的程序重新鏈接編譯。   

  不同的系統(tǒng)使用不同的方法說明程序是否需要使用共享庫。比較典型的有cc和ld命令的可選項。

二、 存儲器分配

  ANSI C說明了三個存儲空間動態(tài)分配的函數(shù)
(1) malloc。分配指定字節(jié)數(shù)的存儲區(qū)。此存儲區(qū)中的初始值不確定。 (2) calloc。在內(nèi)存中動態(tài)地分配nobj個長度為size的連續(xù)空間。該空間中的每一位都初始化為0。 (3) realloc。更改以前分配區(qū)的長度(增加或減少)。當(dāng)增加長度時,可能需要將以前分配區(qū)的內(nèi)容移到另一個足夠大的區(qū)域,而且新增區(qū)域內(nèi)的初始值不確定。

#include <stdlib.h>void *malloc(size_t size);void *calloc(size_t nboj, size_t size);void *realloc(void *ptr, size_t newsize);
三個函數(shù)返回:成功返回為非空指針,出錯為NULLvoid free(void *ptr);

  這三個分配函數(shù)返回的指針一定是適當(dāng)對齊的,使其可以用于任何數(shù)據(jù)對象。在一個特定的系統(tǒng)上,如果最苛刻的對齊要求是double,則對齊必須在8的倍數(shù)的地址單元處,那么這三個函數(shù)返回的指針都應(yīng)這樣對齊。   free函數(shù)釋放的空間通常被送入可用存儲區(qū)池,以后可在調(diào)用分配函數(shù)時再調(diào)用。   realloc如果在原存儲區(qū)后有足夠的空間可供擴(kuò)充,則可在原存儲區(qū)位置上向高地址方向擴(kuò)充。并返回傳給它的同樣的指針值。如果在原存儲區(qū)后沒有足夠的空間則realloc分配一個足夠大的存儲區(qū),將現(xiàn)存的內(nèi)容復(fù)制到新分配的存儲區(qū)中。因為這種存儲區(qū)會移動位置所以不應(yīng)使任何指針指到該區(qū)。   realloc的最后一個參數(shù)是存儲區(qū)的newsize而不是新舊長度之差。如果ptr是空指針,則realloc功能與malloc相同。用于分配一個制定長度newsize的存儲區(qū)。
  這些分配例程通常通過sbrk系統(tǒng)調(diào)用實現(xiàn)。該系統(tǒng)調(diào)用擴(kuò)充或縮小進(jìn)程的堆。
  雖然sbrk可以擴(kuò)充或縮小一個進(jìn)程的存儲空間,但是大多數(shù)malloc和free的實現(xiàn)都不減小進(jìn)程的存儲空間而是將它們保存在malloc池中而不返回給內(nèi)核。
  大多數(shù)實現(xiàn)所分配的存儲空間比所要求的要大,額外的空間用來記錄管理信息--分配塊