一、共享庫
共享庫使得可執(zhí)行文件中不再需要包含常用的庫函數(shù),而只需在所有進(jìn)程都可存取的存儲(chǔ)區(qū)中保存這種庫例程的一個(gè)副本。程序第一次執(zhí)行的時(shí)候或第一次調(diào)用某個(gè)庫函數(shù)的時(shí)候,用動(dòng)態(tài)鏈接方法將程序與共享庫函數(shù)相鏈接,這減少了每個(gè)可執(zhí)行文件的長(zhǎng)度,但增加了一些運(yùn)行時(shí)間開銷。另一個(gè)優(yōu)點(diǎn)就是可以用庫函數(shù)的新版本來替換老版本而無需對(duì)該庫的程序重新鏈接編譯。
不同的系統(tǒng)使用不同的方法說明程序是否需要使用共享庫。比較典型的有cc和ld命令的可選項(xiàng)。
二、 存儲(chǔ)器分配
ANSI C說明了三個(gè)存儲(chǔ)空間動(dòng)態(tài)分配的函數(shù)
(1) malloc。分配指定字節(jié)數(shù)的存儲(chǔ)區(qū)。此存儲(chǔ)區(qū)中的初始值不確定。 (2) calloc。在內(nèi)存中動(dòng)態(tài)地分配nobj個(gè)長(zhǎng)度為size的連續(xù)空間。該空間中的每一位都初始化為0。 (3) realloc。更改以前分配區(qū)的長(zhǎng)度(增加或減少)。當(dāng)增加長(zhǎng)度時(shí),可能需要將以前分配區(qū)的內(nèi)容移到另一個(gè)足夠大的區(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); 三個(gè)函數(shù)返回:成功返回為非空指針,出錯(cuò)為NULLvoid free(void *ptr);
這三個(gè)分配函數(shù)返回的指針一定是適當(dāng)對(duì)齊的,使其可以用于任何數(shù)據(jù)對(duì)象。在一個(gè)特定的系統(tǒng)上,如果最苛刻的對(duì)齊要求是double,則對(duì)齊必須在8的倍數(shù)的地址單元處,那么這三個(gè)函數(shù)返回的指針都應(yīng)這樣對(duì)齊。 free函數(shù)釋放的空間通常被送入可用存儲(chǔ)區(qū)池,以后可在調(diào)用分配函數(shù)時(shí)再調(diào)用。 realloc如果在原存儲(chǔ)區(qū)后有足夠的空間可供擴(kuò)充,則可在原存儲(chǔ)區(qū)位置上向高地址方向擴(kuò)充。并返回傳給它的同樣的指針值。如果在原存儲(chǔ)區(qū)后沒有足夠的空間則realloc分配一個(gè)足夠大的存儲(chǔ)區(qū),將現(xiàn)存的內(nèi)容復(fù)制到新分配的存儲(chǔ)區(qū)中。因?yàn)檫@種存儲(chǔ)區(qū)會(huì)移動(dòng)位置所以不應(yīng)使任何指針指到該區(qū)。 realloc的最后一個(gè)參數(shù)是存儲(chǔ)區(qū)的newsize而不是新舊長(zhǎng)度之差。如果ptr是空指針,則realloc功能與malloc相同。用于分配一個(gè)制定長(zhǎng)度newsize的存儲(chǔ)區(qū)。
這些分配例程通常通過sbrk系統(tǒng)調(diào)用實(shí)現(xiàn)。該系統(tǒng)調(diào)用擴(kuò)充或縮小進(jìn)程的堆。
雖然sbrk可以擴(kuò)充或縮小一個(gè)進(jìn)程的存儲(chǔ)空間,但是大多數(shù)malloc和free的實(shí)現(xiàn)都不減小進(jìn)程的存儲(chǔ)空間而是將它們保存在malloc池中而不返回給內(nèi)核。
大多數(shù)實(shí)現(xiàn)所分配的存儲(chǔ)空間比所要求的要大,額外的空間用來記錄管理信息--分配塊