2011-04-29 48 views
1

我工作的一個玩具語言,下面之間共享的元素是什麼,我試圖做的,思路載體

x = [1 2 3 4 5] 

這定義了一個矢量,然後,

y = rest(x) 

現在y保存所有x除了第一個元素。在本機方面,x是一個向量,當用戶調用它時,除了第一個元素外,它將自己完全複製它。這裏是問題,我只有2 kb的內存,使一個完整的副本是昂貴的。使用鏈表可以解決這個特定的問題,但如果在這種情況下存在內存,鏈表將自行鏈接。那麼是否有一種對這些類型的操作(首先休息是最常見的操作)共享元素的內存有效的結構?

這是一個函數式語言,所以一旦x被定義它不會改變,也沒有提升或std C++ libs可用,我將實現一切。

+3

指向第一個元素的指針執行作業 – 2011-04-29 18:20:16

+0

鏈接列表方法有什麼問題? – abeln 2011-04-29 18:20:23

+0

@abeln:鏈表具有每個元素一個指針的開銷。 – 2011-04-29 18:21:41

回答

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在'slice'不再使用時被釋放。

2

由於您的內存受限制,我可以設想的最佳解決方案是使用指向第一個元素的指針。很難想象會有更節省空間的解決方案。

+3

+1:如果向量是不可變的,那麼這聽起來像是一個很好的答案。 – 2011-04-29 18:28:35