2012-01-18 2 views
4

Последняя версия Sqlite (3.7.10) хотела связать функцию __msize, и поскольку менеджер памяти Delphi не может сообщить размер блока памяти, мне пришлось ввести хак (d5-совместимый)Sqlite 3.7.10 и статическая ссылка в Delphi

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

существуют ли другие решения внутри Sqlite (определяет?) или Delphi, чтобы исправить это, так не используются недокументированные возможности.

+0

Я думаю, что я был бы склонен найти код C, который хочет использовать 'msize' и попытаться удалить его, если это возможно. Я думал, что «msize» был специальным MSVC в любом случае. –

+0

Этот хак не будет работать с более новым менеджером кучи (FastMM4), я подозреваю. Вы должны лучше полагаться на наш ответ ниже. –

ответ

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 таНос, и будет опираться на лучшую FastMM4 reallocmem().

См. this commit, например. для нашей реализации с открытым исходным кодом статической связи SQLite3.

Дополнительная информация:

Я думаю, что мы бы избавиться от этой проблемы в 3.7.11, как указано by this commit: новый SQLITE_WITHOUT_MSIZE глобальный символ будет добавлен, и будет иметь возможность построить укрупнение исходный код без изменения его содержимого, просто установив соответствующее значение SQLITE_WITHOUT_MSIZE. Между тем, проще всего прокомментировать приведенные выше строки.

+0

+1 Это то, о чем я думал в своем комментарии. Конечно, Макси находится на D5 со старым Borland MM. –

+0

Спасибо, я провел несколько исследований параллельно, но в любом случае вы опубликовали хороший ответ. – Maksee

+0

@Maksee Я рекомендую вам переключиться с диспетчера памяти delphi Borland на [используя FastMM4] (http://sourceforge.net/projects/fastmm). Это ускоряет работу приложения, особенно когда дело касается обработки базы данных (статически связанный движок SQLite3 будет намного быстрее), распределение объектов и обработка строк. И вы найдете некоторые интересные функции, такие как отчет об утечке памяти. Он работает как шарм с Delphi 5. –

2

Вы можете использовать SizeOfMem от JCL JclSysUtils.

+0

Хороший блок, спасибо, да-мягкий) – Maksee

Смежные вопросы