跳轉至內容

C 程式設計/MS Windows 參考/alloc.h

來自華夏公益教科書,開放書籍,造福世界

"alloc.h" 是一個非標準的標頭檔案。它不是 ANSI 標準的一部分,因此不是 ANSI C 標頭檔案,但存在於許多 C 語言方言中。它可用於 Borland Turbo C TIGCC。此標頭檔案提供了關於動態記憶體分配的操作。此標頭檔案包含 "記憶體管理" 函式。

示例用法

[編輯 | 編輯原始碼]

要使用 alloc.h 中的函式,我們必須在使用它們之前包含 alloc.h

#include <stdio.h>
#include <alloc.h>

int main()
{
     int *ptr;
     
     ptr = (int *) alloca (sizeof(int));
     scanf("%d", ptr);
     printf("%d is stored dynamically.\n", *ptr);

     return 0;
}
函式宣告 函式目的
void *alloca (unsigned long Size); 在堆疊記憶體上分配儲存空間。
void *calloc (unsigned short NoOfItems, unsigned short SizeOfItems); 從記憶體堆中為給定數量的元素分配記憶體儲存空間。為變數設定的空間的值將自動初始化為零。
void *calloc_throw (unsigned short NoOfItems, unsigned short SizeOfItems); 呼叫 calloc 並如果記憶體不可用則丟擲錯誤。否則返回 calloc 返回的地址。
void *malloc (unsigned long Size); 它在記憶體堆中分配 "Size" 位元組記憶體。它在失敗時返回 NULL。此記憶體塊可以透過 free 函式釋放。
void *malloc_throw (unsigned long Size); 呼叫 malloc 並如果記憶體不可用則丟擲錯誤。否則返回 malloc 返回的地址。
void *realloc (void *Ptr, unsigned long NewSize); 重新分配以前由 *Ptr 分配的記憶體塊。它返回重新分配的記憶體塊的地址,該地址可能與 Ptr 不同。它在失敗時返回 NULL。
void *realloc_throw (void *Ptr, unsigned long NewSize); 呼叫 realloc 並如果記憶體不可用則丟擲錯誤。否則返回 realloc 返回的地址。
void free (void *Ptr); 直接到控制檯釋放由 malloccalloc 分配的記憶體。

堆記憶體分配函式

[編輯 | 編輯原始碼]
函式宣告 函式目的
HANDLE HeapAlloc (unsigned long Size); 它分配 Size 位元組的記憶體堆並返回控制代碼。Size 被視為偶數。奇數大小向上取整。分配的記憶體儲存在單鏈表結構中。最大大小為 65520 位元組,最小大小為 6 位元組。它在失敗時返回 H_NULL。
HANDLE HeapAllocThrow (unsigned long Size); 它呼叫 HeapAlloc 函式並返回相應的控制代碼。它在失敗時丟擲錯誤。
HANDLE HeapAllocESTACK (unsigned long Size); 如果 "Size" 位元組記憶體不可用,則它會截斷表示式堆疊。即使在減少堆疊記憶體後仍然不可用,它也會返回 H_NULL。
HANDLE HeapAllocHigh (unsigned long Size); 它在記憶體堆的高階分配記憶體並返回控制代碼。它將所有已用記憶體塊向下移動到堆中。如果記憶體不可用,它將返回 H_NULL。
HANDLE HeapAllocHighThrow (unsigned long Size); 它呼叫 HeapAllocHigh 函式並返回控制代碼。在失敗時,它會丟擲記憶體錯誤。
void *HeapDeref (HANDLE Handle); 它對控制代碼進行反引用並返回記憶體地址。要使用由控制代碼保留的記憶體,必須對控制代碼進行反引用。
void HeapFree (HANDLE Handle); 它釋放由控制代碼分配的記憶體。
void HeapFreeIndir (HANDLE *HandlePtr); 它釋放與傳遞的控制代碼關聯的記憶體塊並將控制代碼設定為 NULL。
void *HeapAllocPtr (unsigned long Size); 它非常類似於 HeapAllocHigh。它做同樣的事情。但它不是返回控制代碼,而是返回指向分配塊的指標。它在失敗時返回 NULL。
void *HeapAllocPtrThrow (unsigned long Size); 它呼叫 HeapAllocPtr 並返回相應的指標。它在失敗時丟擲錯誤。
void HeapFreePtr (void *Ptr); 它釋放由 HeapAllocPtr 分配的記憶體塊。

雜項函式

[編輯 | 編輯原始碼]
函式宣告 函式目的
unsigned long HeapAvail (void); 它返回記憶體堆中可用的總位元組數。
void HeapCompress (void); 它壓縮所有分配的堆記憶體塊。如果可能,它會刪除空閒記憶體塊。此函式通常在必要時在內部呼叫。
void *HeapEnd (void); 它返回指向記憶體堆末端的指標。
HANDLE HeapLock (HANDLE Handle); 它鎖定由控制代碼分配的記憶體塊。它在成功時返回相同的控制代碼,否則返回 H_NULL。鎖定確保在記憶體堆重新排列期間不會移動或刪除記憶體塊。
short HeapGetLock (HANDLE Handle); 它確定傳遞的控制代碼是否已鎖定。如果塊未鎖定,則返回 0。
void *HLock (HANDLE Handle); 它鎖定並反引用由控制代碼保留的記憶體塊。
unsigned long HeapMax (void); 它返回可以保留的記憶體塊的最大大小。
成員常量 描述
H_NULL 它被稱為空控制代碼。它定義為零值。
NULL 它是一個空指標。它指向地址 0。

預定義型別

[編輯 | 編輯原始碼]
  • Bool
enum Bool {FALSE, TRUE};

它是一個列舉。它定義了兩個二進位制值 false 和 true。常量 FALSE 代表邏輯 0,而常量 TRUE 代表邏輯 1。

  • HANDLE
 typedef unsigned short HANDLE;

控制代碼代表一個已分配的對齊的記憶體塊。它的地址可以透過 alloc.h 中的 HeapDeref 函式檢索。HANDLE 用於管理由 alloc.h 函式分配的記憶體。其他標頭檔案中的某些函式使用 HANDLE 作為引數。

偏離標準

[編輯 | 編輯原始碼]
此影像顯示了 malloc 和 HeapAlloc 之間的重大區別
  • alloca 函式與標準 malloc 函式不同,malloc 在記憶體堆中分配記憶體,而 alloca 在堆疊記憶體中分配記憶體。因此,此儲存是本地的。在函式中,如果使用 alloca 分配記憶體,則它會在函式結束時自動釋放。 alloca 更適合需要本地動態記憶體分配的應用程式。
  • malloc 以線性順序分配給定的位元組塊。它需要連續的記憶體塊。HeapAlloc 分配儲存在連結串列結構中的記憶體。它是有利的。
  • 許多時候,記憶體塊是保留的。長時間鎖定的記憶體塊應該移動到堆中較高的位置。這減少了這些塊與系統其餘部分的干擾。這可以透過使用 HeapAllocHigh 函式來實現。這會在請求記憶體分配之前重新排列堆。
  • 當我們呼叫 malloc 時,記憶體管理器會為分配的塊分配一個稱為控制代碼的指標。為每個塊分配控制代碼。因此,當我們要使用大量小尺寸的記憶體塊時,malloc 效率不高。由於大量控制代碼,處理變得很困難。因此,alloca 是這種情況下的更好選擇。
  • "alloc.h" 中的 HeapRealloc 函式與 realloc 類似。在 HeapRealloc 的情況下,如果重新分配失敗,它會釋放先前分配的記憶體。通常,realloc 會保持先前分配的記憶體塊完好無損。

參考文獻

[編輯 | 編輯原始碼]
華夏公益教科書