直接结构
直接结构(通过指定可选的Direct关键字生成)是C和C++应用程序中的一种高效优化方式,适用于固定大小的类布局。具体来说,这种布局不包含任何动态对象(如具有string、rect、vector、varbinary和sequence类型字段的对象)、可选或可空字段以及其他结构字段。此外,直接结构不能存储在向量中。直接结构将数据字段组织为结构元素,并在内部以C语言结构体的形式存储。
在SmartEDB中,结构是一种将多个数据字段组合在一起的方式。当为类定义普通结构时,可以通过生成的字段级_get()
和 _put()
API访问该结构的元素。使用结构的好处在于,它可以将多个逻辑相关的数据字段组织在一起,并将数据库结构映射到应用程序的内部(例如创建多个序列的时间序列)。然而,调用单独的_get()
函数来读取或_put()
函数来写入所有结构元素可能会带来显著的开销,尤其是在结构元素或数据字段数量较多时。此外,应用程序需要多次调用字段访问器,这对于大量字段或结构元素来说非常不便。为了简化操作,您可以使用_fixed_get()
和 _fixed_put()
API,它们允许一次性读写多个字段(甚至全部字段),将DDL字段映射到生成的C结构中。这虽然只是一个方便的捷径,但确实能提高开发效率。
实际上,DDL编译器会生成两个结构:一个是经过打包处理的(使用**#pragma pack**),另一个是对齐到单词边界的。前者用于在数据库中存储元素,而后者则用于与应用程序交互。数据库运行时从存储中读取/写入每个结构元素,并将其复制到应用程序可见的另一个结构中。
相比之下,当使用直接结构声明时,DDL编译器会创建一个已经填充并对其元素进行对齐的C语言结构,使其与目标单词边界一致。数据库字典引用的结构元素偏移量与应用程序的C结构元素偏移量相对应。这是通过在模式编译时计算目标单词大小来实现的。
因此,可以直接在存储中保留原始的C语言结构,并在一次读/写操作中访问整个结构(而不是通过访问器API)。此外,可以像往常一样对结构的元素进行索引,因为运行时通过字典指定的偏移量引用字段数据,就好像它们是普通字段一样。真正的技巧是在DDL编译时确定目标体系结构的字长,并用它来计算结构字段的偏移量。