如何从绝对地址的 C 样式指针创建对C++对象的引用



我们需要对以补充形式存储的 8/16/32 位(无符号(整数进行大量操作。 为此,我们有一个带有运算符的模板整数类,并且 由此,我们得到了多个具有已签名和无符号 8/16/32 内容的类。

I:E:uint32_atuint32_btint32_atint32_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.

最新更新