我正在研究玩具语言,以下是我正在尝试做的事情,
x = [1 2 3 4 5]
这定义了一个矢量,然后
y = rest(x)
现在y包含除x之外的所有x元素。在原生方面,x是一个向量,当用户调用rest时,它将自制一个完整的副本,除了第一个元素。这是问题我只有2 kb的ram,使得完整的副本很昂贵。使用链接列表可以解决这个特定的问题,但如果在此上下文中存储器占用,则链接列表自己。那么,是否存在一种内存效率高的结构,用于共享元素的这类操作(第一个休息是最常见的操作)?
这是一种函数式语言,因此一旦定义x就不会改变,也没有可用的boost或std c ++库,我将实现所有内容。
答案 0 :(得分:2)
由于你的内存受限,我能想到的最好的解决方案是使用指向第一个元素的指针。很难想象可以有更节省空间的解决方案。
答案 1 :(得分:2)
您可以将[1, 2, 3, 4, 5]
存储在某个内存中,并使x
指向该内存,即
template <typename T>
struct slice { T* begin; T* end; };
....
int backing_store[] = {1, 2, 3, 4, 5};
// ^-- the expression [1 2 3 4 5] create this
....
slice<int> x (backing_store, backing_store + 5);
// ^-- the assignment x = [1 2 3 4 5] does this
然后您可以将rest
实现为
template <typename T>
slice<T> rest(slice<T> p) {
return slice<T>(p.begin + 1, p.end);
}
您可以使用一些引用计数方案或GC(可能对您的内存来说太大)确保在没有“切片”使用它时释放backing_store
。