MicroPython使用字符串驻留可以同时保存在RAM和ROM,这就避免了存储相同字符串的重复副本,这主要适用于代码中的标识符,因为函数或变量名很可能会在代码中的多个地方出现。在MicroPython中,内部字符串被称为QSTR(uniQue STRing唯一字符串)。
QSTR值(类型为qstr
)是QSTR池链接表的索引。QSTR会存储其长度及其内容的哈希值,以便在去重过程中进行快速比较。所有处理字符串的字节码操作都使用QSTR参数。
编译时生成QSTR
在 MicroPython C 代码中,任何应在最终固件中内嵌的字符串都被写成 MP_QSTR_Foo
。在编译时,这将评估指向QSTR池中"Foo"
索引的qstr
值。
Makefile 中的一个多步骤过程实现了这一功能。总的来说,这个过程包括三个部分:
- 查找代码中的所有
MP_QSTR_Foo
标记。 - 生成一个静态QSTR池,其中包含所有字符串数据(包括长度和哈希值)。
- 用相应的索引替换所有
MP_QSTR_Foo
(通过预处理器)。
MP_QSTR_Foo
标记从两个来源中搜索:
-
$(SRC_QSTR)
中引用的所有文件。这是所有的C代码(即py
、extmod
、ports/stm32
)但不包括第三方代码,如lib
。 -
附加的
$(QSTR_GLOBAL_DEPENDENCIES)
(包括mpconfig*.h
)。
注意:frozen_mpy.c
(由mpy-tool.py
生成)有自己的