【发布时间】:2019-09-11 10:36:04
【问题描述】:
总体目标
我正在为没有动态内存分配的嵌入式系统编写一个存储库,它可以处理在单个数组/静态内存池中存储几种不同类型的对象。对象应该表现得好像它们是彼此的成员一样。
对象的数量未知。数据来自结构化源,因此只需将其添加到存储中一次。数据按顺序添加,但需要任意读取。
具体问题
每个对象都是一个简单的类,但这些类的实例需要访问共享存储池。
我的解决方案
我设置了一个包含简单 POD 对象的联合数组,所有这些对象都具有相似的大小。这些对象将其孩子在池中的位置存储为私有成员。这两种不同的类型从相反的方向生长,因此只有对象的总数是有限的。
添加到商店可以通过主类完成,主类需要访问这些私有成员,因此主类在对象类中被声明为友元。
但是,对象不能访问主存储池,所以现在我已经在类之外声明了存储池。由于开销,我不想在对象中存储指向存储的指针。一次只需要存在一家商店。
代码(用于 C++11)
以下是工作代码,但它不会阻止访问存储池。那么有没有更好的办法呢?
#include <cstdio>
#include <cstdint>
namespace Store{
const int STORE_SIZE = 512;
// 8 bytes
class Chair {
public:
int a;
int n_legs;
};
// 8 bytes
class Room {
friend class Flat;
private:
uint16_t chairs_start;
public:
uint16_t number_of_chairs;
int a;
int b;
// member functions
Chair getChair( int idx );
};
// 8 byte element of storage can be either one or the other
union Element{
Chair chair;
Room room;
};
union Element;
Element pool[STORE_SIZE];
Chair Room::getChair( int idx )
{
return pool[chairs_start - idx].chair; // needs access to pool!
}
class Flat{
public:
void addRoom() {
Room room;
room.chairs_start = pool_next_chair;
pool[pool_next_room++].room = room;
}
void addChair() {
Chair chair;
chair.a = pool_next_chair; // only for testing
pool[pool_next_chair--].chair = chair; // add chair to pool from other side
// incremente chair count for last added room
pool[pool_next_room - 1].room.number_of_chairs++;
}
Room getRoom( int idx ){
return pool[idx].room;
}
private:
uint16_t pool_next_room = 0;
const uint16_t pool_first_chair = STORE_SIZE - 1;
uint16_t pool_next_chair = pool_first_chair;
};
}
int main() {
Store::Flat flat;
flat.addRoom();
flat.addChair();
flat.addChair();
flat.addRoom();
flat.addChair();
auto room2 = flat.getRoom(1);
auto chair1 = room2.getChair(0);
printf("Got chairs %d and %d\n",chair1.a, flat.getRoom(0).getChair(1).a);
// Got chairs 509 and 510
return 0;
}
代码有效,但池可访问。一般来说,我可以使用更好的布局或结构来实现与上述 main() 函数类似的简单访问方式吗?
非常欢迎任何其他代码质量的 cmets!非常感谢!
【问题讨论】:
标签: c++