第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但仍有一些不同之处。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还将帮助 支持 Lua 项目。
用 Lua 编程 | ||
第四部分。C API 第 28 章。C 中的用户自定义类型 |
在上一章中,我们了解了如何使用 C 编写的函数扩展 Lua。现在,我们将了解如何使用 C 编写的类型扩展 Lua。我们将从一个小示例开始,并通过元方法和其他优点在本章中对其进行扩展。
我们的示例是一个非常简单的类型:数字数组。此示例的主要动机是它不涉及复杂的算法,因此我们可以专注于 API 问题。尽管很简单,但此类型对某些应用程序很有用。通常,我们不需要 Lua 中的外部数组;哈希表可以很好地完成这项工作。但是,对于大型数组,哈希表可能会占用大量内存,因为对于每个条目,它们必须存储一个通用值、一个链接地址以及一些额外的空间以进行增长。在 C 中直接实现(我们在其中存储数字值,而没有任何额外空间)使用的内存不到哈希表使用的内存的 50%。
我们将使用以下结构表示我们的数组
typedef struct NumArray { int size; double values[1]; /* variable part */ } NumArray;我们仅将数组
values
声明为大小 1,作为占位符,因为 C 不允许大小为 0 的数组;我们将通过为数组分配的空间定义实际大小。对于包含 n
个元素的数组,我们需要 sizeof(NumArray) + (n-1)*sizeof(double)
字节。(我们从 n
中减去 1,因为原始结构已经包含了一个元素的空间。)
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |