我们需要对以互补形式存储的8/16/32位(无符号)整数进行大量操作。为此,我们有一个带有运算符的模板整数类,并且从中我们得到具有带符号和无符号8/16/32内容的多个类。
I:E:uint32_at
,uint32_bt
,int32_at
,int32_bt
等。其中每个类实例都有一个内部变量val
及其值。
我们想要具有此类对象的常量数组,但是如果我们定义:
const uint32_bt table[4096] = { uint32_at(5), uint32_at(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]);
}
所以问题是,我如何转换地址,以便可以返回对对象的引用?
编译器会为每个元素生成一个构造函数调用。
使uint32_at
构造函数constexpr
。