首先让我说我正在为微控制器创建软件,因此 RAM 的使用很重要,将大块 const 数据放入非易失性(闪存)存储器是有意义的。
我想要实现的是找到一种在 C++ 中创建“拆分”对象的好方法。作为一个例子,我们假设有一个字节的数据(读/写)和一个多字节的“收据”来访问它。假设“receipt”是一个长字符串,它是一个文件名,它指向的媒体很慢,所以在内存中缓冲单个字节是有意义的,而不是在每个请求时实际读取它。
class Data
{
uint8_t byte;
bool valid;
const char filename[128];
uint8_t read()
{
if (!valid)
performReallySlowRead(filename, &byte);
valid = true;
return byte;
};
void write(uint8_t new_value)
{
byte = new_value;
performRealWriteToMedia(filename, byte);
valid = true;
};
}
这种方法的明显问题是整个 130 字节最终都在 RAM 中,而其中只有两个需要更改。所以我想出了一个拆分对象的想法:
class DataNonConst
{
uint8_t byte;
bool valid;
}
class DataConst
{
const char filename[128];
DataNonConst * const data;
}
static DataNonConst storage;
const DataConst holder("some_long_name_here", &storage);
现在唯一的问题是,如果我想要数百个这样的拆分对象,那么创建它们的过程(因此创建两个对象并链接第二个到第一个)会变得非常无聊和有问题......
所以问题是 - 有没有一些好方法让它更容易使用,最好是聪明的 C++ 技巧或者一些模板魔法?也就是说 - 如何创建两个链接在一起的对象,用一个语句,最好是隐藏一个对象?我不认为宏解决方案在这里是可能的,因为没有简单的方法来自动创建存储对象的名称......对象需要是相同的类型,因为我需要在其他地方嵌入指向这些对象的指针(一个函数处理编写它们,另一个只关心读取)......我想到的所有解决方案都需要使用模板的虚拟接口(所以你通过 vtable 指针使对象变大并且可能得到一个奖励模板-bloat) 或导致巨大的模板膨胀...
编辑:
实际上,整个问题的一部分可以简化为一个更简单的问题——有没有办法将匿名变量“绑定”到 C++ 中的成员字段?某事喜欢:
const ConstData holder("...", NonConstData()); // this object HAS TO be ROMable
在上面的“一厢情愿”中,持有者是 ROM 中的 const 对象,它具有指向在 RAM 中“某处”创建的匿名对象 NonConstData 的指针/引用/任何内容。或者:
std:pair<const ConstData &, NonConstData &> holder(ConstData(), NonConstData());
任何允许我不手动创建两个对象并将一个对象绑定到另一个对象的东西。