2012-01-18 75 views
4

Sqlite(3.7.10)的最新版本希望鏈接__msize函數,並且由於Delphi內存管理器不能報告內存塊的大小,所以我不得不引入一個hack(兼容d5 )Sqlite 3.7.10和Delphi中的靜態鏈接

function __msize(p: pointer): Cardinal;cdecl; 
begin 
    Result:=PInteger(integer(p)-4)^-6; 
end; 

Sqlite(定義?)或Delphi中是否有其他的解決方案來解決這個問題,所以沒有使用非文檔化的功能。

+0

我想我會傾向於找到想要使用'msize'的C代碼並嘗試在可能的情況下將其刪除。我以爲msize在任何情況下都是MSVC的特例。 – 2012-01-18 10:26:21

+0

我懷疑,這種破解不能用於較新的堆管理器(FastMM4)。你應該更好地依靠我們的答案。 – 2012-01-18 13:07:46

回答

8

圍繞在源代碼行#15195,評論下面幾行:

/* 
** Windows systems have malloc_usable_size() but it is called _msize() 
*/ 
#if !defined(HAVE_MALLOC_USABLE_SIZE) && SQLITE_OS_WIN 
# define HAVE_MALLOC_USABLE_SIZE 1 
# define malloc_usable_size _msize 
#endif 

/* 
** Windows systems have malloc_usable_size() but it is called _msize() 
#if !defined(HAVE_MALLOC_USABLE_SIZE) && SQLITE_OS_WIN 
# define HAVE_MALLOC_USABLE_SIZE 1 
# define malloc_usable_size _msize 
#endif 
*/ 

這將禁用的SQLite3的malloc的內存重用,將依靠更好FastMM4 reallocmem()實現。

請參閱this commit例如爲我們的開源實現SQLite3靜態鏈接。

其他信息:

我認爲我們會在3.7.11擺脫這個問題,如上所述by this commit:新SQLITE_WITHOUT_MSIZE全局符號將被添加,並且將能夠構建融合源代碼不改變其內容,只需通過設置適當的SQLITE_WITHOUT_MSIZE定義即可。與此同時,最簡單的就是評論上述內容。

+0

+1這是我在評論中想到的。當然,看起來Maksee是和老Borland MM一起在D5上的。 – 2012-01-18 13:12:53

+0

謝謝,我做了一些並行的研究,但無論如何你發佈了一個很好的答案 – Maksee 2012-01-18 14:42:20

+0

@Maksee我建議你從delphi Borland內存管理器切換到[使用FastMM4](http://sourceforge.net/projects/fastmm)。它加快了應用程序的速度,特別是當它與數據庫處理(一個靜態鏈接的SQLite3引擎將*更快*),對象分配和字符串處理。你會發現一些不錯的功能,比如內存泄漏報告。它的工作原理類似於Delphi 5的魅力。 – 2012-01-18 19:00:31

2

您可以使用JCL JclSysUtils單位的SizeOfMem。

+0

好的單位,謝謝,da-soft) – Maksee 2012-01-19 07:26:33