Sqlite源码解读(三)

本文深入探讨SQLite在Win32环境下如何管理内存,包括使用独立堆的条件及其警告,以及最大堆初始化和缓存大小的计算。同时,介绍了sqlite3_VFS的xSetSystemCall方法在WIN32 VFSes中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021SC@SDUSC

接着上次的winVfsAppData结构体继续往下看。

#ifdef SQLITE_WIN32_MALLOC

malloc()是Sqlite在缺省情况下调用C标准库例程来分配内存的。

如果这不是零,则本机Win 32分配器子系统将创建一个孤立的堆;否则,将使用默认的进程堆。此设置在为WinRT编译时没有任何影响。默认情况下,这是启用的,并且将创建一个独立的堆来存储所有分配的数据

此处出现了一个warning:当设置为非零并且调用了winMemShu倒计时函数时,使用隔离堆分配的所有数据都将立即被释放,而任何试图访问已释放的数据会立即导致访问冲突。

#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE

#  define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U)

#endif

Win32特定堆的最大初始大小

#ifndef SQLITE_WIN32_CACHE_SIZE

#  if SQLITE_DEFAULT_CACHE_SIZE>=0

#    define SQLITE_WIN32_CACHE_SIZE     (SQLITE_DEFAULT_CACHE_SIZE)

#  else

#    define SQLITE_WIN32_CACHE_SIZE     (-(SQLITE_DEFAULT_CACHE_SIZE))

#  endif

#endif

计算Win32特定堆的初始大小时所用的缓存大小

#ifndef SQLITE_WIN32_MAX_CACHE_SIZE

#  define SQLITE_WIN32_MAX_CACHE_SIZE   (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \

                                          (SQLITE_WIN32_HEAP_INIT_EXTRA)) / \

                                         (SQLITE_DEFAULT_PAGE_SIZE))

#endif

根据可能最大的初始堆大小和默认页大小,计算最大合法缓存大小(以页为单位),并预留所需的额外空间。

typedef struct winMemData winMemData;
struct winMemData {
   
#ifndef NDEBUG
  u32 magic1;   
#endif
  HANDLE hHeap; 
  BOOL bOwned;  
#ifndef NDEBUG
  u32 magic2;   
#endif
};
 
#ifndef NDEBUG
#define winMemAssertMagic1() assert( win_mem_data.magic1==WINMEM_MAGIC1 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值