问题描述
||
我正在研究一种玩具语言,下面是我想做的事情,
x = [1 2 3 4 5]
然后定义一个向量
y = rest(x)
现在y包含x的所有元素,除了第一个。在本机端,x是向量,当用户调用其上的x时,它将复制其自身的完整副本(第一个元素除外)。这是我只有2 kb的ram的问题,制作完整副本非常昂贵。使用链表可以解决这个特定问题,但是如果在这种情况下出现内存浪费,链表本身就可以解决。那么,对于共享元素的此类操作(是否存在最频繁的操作),是否存在一种对内存有效的结构?
这是一种功能性语言,因此一旦定义了x,它就不会改变,也没有boost或std c ++库可用,我将实现所有功能。
解决方法
您可以将
[1,2,3,4,5]
存储在某个内存中,并使x
指向该内存,即
template <typename T>
struct slice { T* begin; T* end; };
....
int backing_store[] = {1,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(可能对于您的内存而言太大)来确保在没有\'slice \'不再使用backing_store
时将其释放。
,由于您的内存有限,因此我能想到的最佳解决方案是使用指向第一个元素的指针。很难想象会有一个更节省空间的解决方案。