可选结构
在SmartEDB中,结构体是一组数据元素的集合,可以作为类的一个字段。对于可选声明的字段,意味着该字段可能存储也可能不存储在数据库中。SmartEDB运行时仅在应用程序显式为该字段赋值时才会为其分配内存。实际的数据仅在提交新事务时才会被存储到数据库中。如果字段未被存储,运行时不会为它预留空间,除了保留2或4字节的引用地址。
在这种情况下,相关的get方法将返回一个空指针。
在C API中,classname_fieldname_read_handle()
和 classname_fieldname_write_handle()
函数会返回错误代码 MCO_E_EMPTYOPTIONAL
。
结构体的内存分配规则与其他字段相同:如果结构体包含动态字段,则该类将使用树状内存布局进行存储;否则,SmartEDB运行时会将其作为固定记录存储。对于可选结构体字段,与动态字段一样,SmartEDB始终使用树状内存布局。
为了操作可选结构体,应用程序可以使用与普通结构体相同的API。
在C API中,使用classname_structname_read_handle()
和 classname_structname_write_handle()
。
需要注意的是:
- 要分配可选结构体,请使用
classname_structname_write_handle()
函数写入该结构体以获取写句柄。 - 如果可选结构字段尚未分配,
classname_structname_read_handle()
API可能会返回MCO_E_EMPTYOPTIONAL
错误代码。 - 使用
classname_fieldname_erase()
API可以取消分配可选结构体。
此外,SmartEDB运行时提供了内存碎片整理和自动压缩机制,这有助于减少可选结构体的大小,但树状内存布局的开销仍然存在。