第28章 User-Defined Types in C |
在面的一章,我们讨论了如何使用C函数扩展Lua的功能,现在我们讨论如何使用C中新创建的类型来扩展Lua。我们从一个小例子开始,本章后续部分将以这个小例子为基础逐步加入metamethods等其他内容来介绍如何使用C中新类型扩展Lua。
我们的例子涉及的类型非常简单,数字数组。这个例子的目的在于将目光集中到API问题上,所以不涉及复杂的算法。尽管例子中的类型很简单,但很多应用中都会用到这种类型。一般情况下,Lua中并不需要外部的数组,因为哈希表很好的实现了数组。但是对于非常大的数组而言,哈希表可能导致内存不足,因为对于每一个元素必须保存一个范性的(generic)值,一个链接地址,加上一些以备将来增长的额外空间。在C中的直接存储数字值不需要额外的空间,将比哈希表的实现方式节省50%的内存空间。
我们使用下面的结构表示我们的数组:
typedef struct NumArray {
int size;
double values[1]; /* variable part */
} NumArray;
我们使用大小1声明数组的values,由于C语言不允许大小为0的数组,这个1只是一个占位符;我们在后面定义数组分配空间的实际大小。对于一个有n个元素的数组来说,我们需要
sizeof(NumArray) + (n-1)*sizeof(double) bytes
(由于原始的结构中已经包含了一个元素的空间,所以我们从n中减去1)