内存管理
Squirrel使用引用计数作为内存管理中主要系统。然而Squirrel虚拟机使用一个辅助标识和垃圾收集器,该收集器可以被想强行调用。
两种可能的编译期操作:
- 默认的设置是引用计数外加辅助标识和一个垃圾收集器。宿主程序在程序执行期间可以调用函数sq_collectgarbage()函数完成垃圾回收。Squirrel虚拟机不会主动调用垃圾收集器,需要宿主程序显式的调用。
- 第二种情况是只有一个引用计数器(定义在NO_GARBAGE_COLLECTOR),这中情况下,虚拟机不会检测引用链,所以需要开发人员显式的解决引用的问题以防止内存泄露。
第二种情况唯一的优点就是可以节省两个额外的指针,为每一个对象在默认的配置表中存放该指针以供垃圾收集器使用(32位系统存放8位的指针)。相关的类型有表,数组,函数,线程,userdata以及生成器。其他类型则被忽略。这些选项不会影响执行速度。
Unicode
默认情况下,Squirrel字符串这是纯粹的8为ASCII字符。但是如果在虚拟机中定义了宏“SQUNICODE”,编译器和API将使用16位字符。
64位机上使用Squirrel脚本
在C++预编译器上通过定义'_SQ64'宏,可以在64位机上编译Squirrel脚本。这个宏可以在包含了“squirrel.h”文件的任何工程里定义。
Squirrel中使用双精度浮点型
在C++预编译器上通过定义“SQUSEDOUBLE”使得Squirrel支持双精度。这个宏可以在任何一个包含了“squirrel.h”的工程中定义。如果在32位机上定义该宏,虚拟机会增加大量的内存。
错误约定
大多Squirrel函数返回SQRESULT,SQRESULT表示该函数是否成功执行。宏 SQ_SUCCEEDED() 和SQ_FAILED()负责测试函数的返回值。
if(SQ_FAILED(sq_getstring(v,-1,&s)))
printf("getstring failed");
初始化Squirrel
宿主程序首先必须做的事是创建一个虚拟机。宿主程序可以通过函数sq_open()创建任意多个虚拟机。
如果虚拟机不在需要,每一个单独的虚拟机都需要调用sq_close()释放。
int main(int argc, char* argv[])
{
HSQUIRRELVM v;