向量之间共享元素的想法

问题描述

|| 我正在研究一种玩具语言,下面是我想做的事情,
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
时将其释放。     ,由于您的内存有限,因此我能想到的最佳解决方案是使用指向第一个元素的指针。很难想象会有一个更节省空间的解决方案。