我们需要对以补充形式存储的 8/16/32 位(无符号(整数进行大量操作。 为此,我们有一个带有运算符的模板整数类,并且 由此,我们得到了多个具有已签名和无符号 8/16/32 内容的类。
I:E:uint32_at
、uint32_bt
、int32_at
、int32_bt
等。 其中每个类实例都有一个内部变量val
值。
我们希望拥有此类对象的常量数组,但是如果我们定义:
const uint32_bt table[4096] = { uint32_bt(5), uint32_bt(17), ... };
编译器为每个元素生成一个构造函数调用。 一个高效的编译器将生成 4 x 4096 = 16,384 字节的闪存。 我们的编译器生成大约 100kB 的闪存和 16384 字节的 SRAM, 因为它调用构造函数来创建每个元素。
一个想法是用 C 语言生成表,然后 为完整表创建一个C++类。
const uint32_t CTable[4096] = { ... };
然后创建传递指针和大小的表类的实例。
CPP_Table Table(4096, CTable);
This initiates two internal variables
tab = CTable
size = 4096
然后,索引运算符将返回一个对象,该对象只是对 C 表中某些内容的引用。
uint32B operator [] (
const uint32B& operator [] (const uint32_t index) const
{
return (somekindofcast)(&tab[size - index]);
}
所以问题是,如何转换地址以便返回对对象的引用?
const uint32_bt table[4096] = { uint32_at(5), uint32_at(17), ... };
编译器为每个元素生成一个构造函数调用。
使uint32_at
构造函数constexpr
。并使其成为一系列uint32_at
.