小巧、快速、可靠。
選擇其中三項。

SQLite C 介面

記憶體配置例程 (記憶體配置常式)

typedef struct sqlite3_mem_methods sqlite3_mem_methods;
struct sqlite3_mem_methods {
  void *(*xMalloc)(int);         /* Memory allocation function */
  void (*xFree)(void*);          /* Free a prior allocation */
  void *(*xRealloc)(void*,int);  /* Resize an allocation */
  int (*xSize)(void*);           /* Return the size of an allocation */
  int (*xRoundup)(int);          /* Round up request size to allocation size */
  int (*xInit)(void*);           /* Initialize the memory allocator */
  void (*xShutdown)(void*);      /* Deinitialize the memory allocator */
  void *pAppData;                /* Argument to xInit() and xShutdown() */
};

此物件的實例定義了 SQLite 與底層記憶體配置常式之間的介面。

此物件僅在 SQLite 介面中的一個地方使用。此物件實例的指標是當設定選項為 sqlite3_config() 的引數,當設定選項為 SQLITE_CONFIG_MALLOCSQLITE_CONFIG_GETMALLOC 時。通過創建此物件的實例並在配置期間將其傳遞給 sqlite3_config(SQLITE_CONFIG_MALLOC),應用程式可以為 SQLite 指定一個替代的記憶體配置子系統,以滿足其所有動態記憶體需求。

請注意,SQLite 附帶了幾個 內建記憶體配置器,這些配置器完全足以滿足絕大多數應用程式的需求,而且此物件僅對具有特殊記憶體配置需求的少數應用程式有用。此物件也用於 SQLite 的測試過程中,以指定一個模擬記憶體不足情況的替代記憶體配置器,以便驗證 SQLite 能夠從此類情況中正常恢復。

xMalloc、xRealloc 和 xFree 方法必須像標準 C 函式庫中的 malloc()、realloc() 和 free() 函數一樣工作。SQLite 保證 xRealloc 的第二個引數始終是先前呼叫 xRoundup 所返回的值。

xSize 應該返回先前從 xMalloc 或 xRealloc 獲得的記憶體配置的已配置大小。已配置大小始終至少與請求的大小一樣大,但可能更大。

xRoundup 方法返回給定特定請求大小的記憶體配置的已配置大小。大多數記憶體配置器會將記憶體配置至少向上捨入到 8 的倍數。某些配置器會向上捨入到更大的倍數或 2 的冪。通過 sqlite3_malloc()sqlite3_realloc() 進來的每個記憶體配置請求都會先呼叫 xRoundup。如果 xRoundup 返回 0,則會導致相應的記憶體配置失敗。

xInit 方法初始化記憶體配置器。例如,它可能會配置任何所需的互斥鎖或初始化內部資料結構。xShutdown 方法由 sqlite3_shutdown()(間接)呼叫,並且應該釋放由 xInit 獲取的任何資源。pAppData 指標用作 xInit 和 xShutdown 的唯一參數。

當 SQLite 呼叫 xInit 方法時,它會持有 SQLITE_MUTEX_STATIC_MAIN 互斥鎖,因此 xInit 方法不需要是執行緒安全的。xShutdown 方法僅從 sqlite3_shutdown() 呼叫,因此它也不需要是執行緒安全的。對於所有其他方法,只要 SQLITE_CONFIG_MEMSTATUS 設定選項已開啟(預設情況下已開啟),SQLite 就會持有 SQLITE_MUTEX_STATIC_MEM 互斥鎖,因此這些方法會自動序列化。但是,如果停用了 SQLITE_CONFIG_MEMSTATUS,則其他方法必須是執行緒安全的,或者自行安排序列化。

如果沒有中間呼叫 xShutdown(),SQLite 將永遠不會多次呼叫 xInit()。

另請參閱 物件常數函式 列表。