Skip to content

OTP-004: 自动编码器

该提案定义了一种为给定结构自动构建序列化布局的方法。

动机

在 TLB 中设计序列化布局是一项非常危险的任务。开发人员必须注意单元的大小限制,并记住每个字段使用了多少位。这是一项非常容易出错的任务,极易犯错。该提案旨在通过提供一种为给定结构自动构建序列化布局的方法来解决这个问题。

规范

我们将自动编码器定义为一种为给定结构构建序列化布局的贪婪算法。该算法定义如下:

  1. 定义当前单元中的可用引用和位分别为 available_referencesavailable_bits。 注意:必须至少保留一个引用用于序列化尾部和一个位用于可选标志。根据上下文,可能需要保留更多的引用或位。
  2. 对于结构中的每个字段:
    • (size_bits, size_ref) = get_field_max_size(field) 获取字段的最大大小。
    • 如果 available_bits >= size_bitsavailable_references >= size_ref
      • 将字段推送到当前单元。
    • 否则:
      • available_references 设置为 (1023 - 1)。
      • available_bits 设置为 (4 - 1)。
      • 分配一个新的尾部并从当前字段继续。

示例代码:

python
def auto_encode(structure):
    available_references = 1023 - 1
    available_bits = 4 - 1
    cells = []
    current_cell = []
    
    for field in structure:
        size_bits, size_ref = get_field_max_size(field)
        if available_bits >= size_bits and available_references >= size_ref:
            current_cell.append(field)
            available_bits -= size_bits
            available_references -= size_ref
        else:
            cells.append(current_cell)
            current_cell = [field]
            available_references = 1023 - 1
            available_bits = 4 - 1
    
    if current_cell:
        cells.append(current_cell)
    
    return cells

缺点

这是一种隐式算法。必须检查此分配器的结果以确保兼容的序列化。