在动态内存中,我能够在对象上完美地创建和操作。 我通过解析一个完美的SD卡来创建这些对象。 由于微控制器上的动态存储器的限制,我想 将这些对象存储在EEPROM或FRAM上。
以下函数(来自FRAM库)可用于将动态内存中的字节存储到FRAM:
void write8 (uint16_t addr, uint8_t value);
void write (uint16_t addr, const uint8_t *values, size_t count);
uint8_t read8 (uint16_t addr);
对象具有以下类:
class Person
{
public:
char* m_pStrName;
int m_nAge;
bool m_fIsMale;
//Constructor
Person(char* strName, int nAge, bool fIsMale);
Person();
//Copy constructor
Person( const Person &obj );
//Destructor
~Person();
};
我尝试了以下方法来创建一个Person对象并存储它:
Person* pTestPerson = new Person();
fram.write(0x0000, pTestPerson, sizeof(Person));
//由于少量动态内存(我创建此对象的位置) //我应该释放并删除指向该人的指针吗?
delete pTestPerson;
pTestPerson = nullptr;
//现在有趣的部分,如何读取sizeof(Person)字节数并创建一个新的有效Person对象?我尝试了以下内容,但可能是胡说八道:
Person* pReadPerson = new Person();
for (int x = 0; x < sizeof(Person); x++)
{
*(pReadPerson + x) = fram.read(0x0000 + x);
}
答案 0 :(得分:2)
您需要为对象编写自定义序列化/反序列化代码。这在计算机编程中是一个非常普遍的问题,因此很多语言都内置了序列化(Python是一个突出的例子)。
在你的情况下,你可以这样做:
反序列化看起来很相似: 1.读取m_pStrName并将其存储在一旁 2.读取m_nAge并将其存储在对象中 3.读取m_fIsMale并将其存储在对象中 4.分配“m_pStrName的长度”字节并将其附加到m_pStrName指针 5.读取名称并将其存储在m_pStrName内存块中(注意字符串长度)
数据序列化和反序列化很棘手,因为很容易犯一个小错误,完全破坏你的对象。
另一个严重的问题是数据版本控制。如果您更新Person
布局,则需要更改序列化代码并(可能)使其向后兼容。
答案 1 :(得分:0)
类的类型的对象不会在分配给对象的内存中存储一些属性,如方法,vptr。因此,你不能在这个单词的直接含义中存储类。但是,您可以将数据有效负载仅放入ROM中,并且类可以通过引用来操作。因此,换句话说,该类将仅根据您的需要实现使用ROM内容的功能。然后RAM内存占用将被最小化。