具有查找表的可选帮助的对象查找,如果未使用,则必须对其进行优化

Object lookup with optional help of a lookup table which must be optimized away if unused

本文关键字:查找 优化 未使用 帮助 对象 如果      更新时间:2023-10-16

我想通过添加一个可选的查找表来加快Cortex-M4应用程序中那些大量使用的字体的字形查找。我现在拥有的是——简化的和伪的——这个:

在fontname-font.cpp中:

static const uint8_t someFont = {
headerbytes[knownHeaderSize],
glyph[knownGlyphCount]
};

每个字形的大小取决于字形。有些基本上是空的(例如空格),有些更大(如"M")。每个字形的大小都存储在字形的头部中,因此我可以循环浏览字体,并找出代码为code的字形的起始偏移量(someFont[offset])。

在fontname-map.pp:中

static const uint16_t someFont_lut[knownGlyphCount];

所以如果包括LUT,我可以使用CCD_ 3。

如何在提供方便界面的类中组合字体和可选LUT?在我看来,将信息拆分为两个文件已经是个坏主意了(不过我可以改变这一点),但即使它们在同一个文件中,我如何设计一个允许可选使用LUT的类,并允许在不使用LUT时对其进行优化?

我想将应用程序接口简化为

Glyph Font::operator[](const char& c);

其中CCD_ 4可以仅仅是指向存储在闪存中的字形的指针或者可以用于从闪存检索字形数据的代理对象。LUT的存在和使用应隐藏在该运算符后面。

我正在使用gcc,建议可能是针对gcc的。哪些字体应该包含LUT在编译时是已知的。


添加:我希望该解决方案能防止我将一种字体的字形与另一个字体的LUT混合。如果要使用LUT,我想指定,而不是。字体读取类必须自己找到它。

使用您的规范,您只需要编写共享同一接口的两个字体类。一个使用慢速"运算符[]",另一个构建提供快速"运算符[]"的LUT。使用字体的函数需要根据字体类型进行模板化。

如果您只使用非常小的字体子集,您甚至可以创建一个模板类,使用字符地址和查找表作为模板参数。在这种情况下,使用字体的函数将为使用它们的每个字体单独编译,但字体数据结构的地址可以内联到使用字体的功能中。

由于模板解决方案甚至允许您将上一节中描述的"固定"字体与"动态"字体混合,其中被调用的函数获得指向字符数据或字符数据的数据结构("动态字体"类)的指针,以及可选的LUT。

如果您的主要问题是如果您的代码不使用LUT,则不链接LUT:只需将所有fontname-xxx.cpp文件编译为单独的对象文件,然后将它们放入静态库。当您使用该库时,编译器只选择您在应用程序中引用的对象。